2011-11-11 56 views
0

我寫了一段代碼,根據用戶設置的布爾值寫入控制檯或文件。只是想知道是否有可能的數據丟失?

代碼如下所示。

#include <iostream> 
#include <fstream> 

int main() 
{ 
    bool bDump; 
    std::cout<<"bDump bool"<<std::endl; 
    std::cin>>bDump; 
    std::ostream* osPtr; 
    std::ofstream files; 

    if(bDump) 
    { 
    files.open("dump.txt"); 
    osPtr = &files; 
    } 
    else 
    { 
    osPtr = &std::cout; 
    } 

    std::ostream& stream = *osPtr; 
    stream<<"hello"; 

    if(bDump) 
    { 
    files.close(); 
    } 
    return 0; 
} 

這裏我創建一個std :: ostream的指針,並且取決於布爾值我assinging要麼使用ofstream對象或std ::法院的地址。我唯一擔心的就是文件操作如打開或關閉是否正確完成。由於我是C++新手,請幫助我。同時指出這裏是否有不良的編程習慣。

+0

你試過嗎?它是否像你想要的那樣工作? –

+0

是的,它的工作。 –

回答

4

它的正確性和可行性。
我會採取不同的做法主要是not to explicitly call close(),因爲這是由析構函數自動完成的。

你可以用三元運算符稍微簡化你的代碼(並且擺脫指針);

#include <iostream> 
#include <fstream> 

int main() 
{ 
    bool bDump; 
    std::cout << "bDump bool"<<std::endl; 
    std::cin >> bDump; 
    std::ofstream files; 

    std::ostream& stream = (bDump) ? (files.open("dump.txt"), files) 
            : std::cout; 

    stream<<"hello";  
} 
+0

+1主要用於擺脫那個相當難看的指針。 :) – cHao

0

沒有潛在的泄漏。但是,如果一個異常被

stream<<"hello"; 

然後

files.close(); 

不會被調用拋出,但對你的代碼的具體例子有沒有問題。 ofstream的析構函數恰好爲你調用close()。

+0

事實上,除非你的函數在完成文件後運行了很長一段時間,'files.close()'是沒用的。 (RAII的重點在於處理這樣的事情,相信它。)如果函數將在很長時間後運行,那麼我會說有一個需要分離的問題需要擔心。 – cHao

0

你做得很好,但最後沒有必要使用close(),因爲在C++中我們依靠析構函數來爲我們進行清理,而std::ofstream有一個自動關閉文件的函數。

您也可以省略return 0;聲明在main() C++中的底部:0(成功,真的)將被默認返回。

相關問題