2014-02-13 52 views
0

如果這是一個完全愚蠢的問題,我很抱歉,但我仍然遇到麻煩。如果需要,創建一個ofstream

我想傳遞兩個std::string fileNames的功能foo如下:

富(INT someValue中,的std :: string FILENAME1,的std :: string文件名2)

我再想以檢查它們是否都具有一個有一個文件名長度超過""如下:

bool hasFile1 = true; 
if(fileName1.empty()) 
{ 
    hasFile1 = false; 
} 

我的問題是有因爲我希望能夠創建一個ofstream如果hasFile1 == truehasFile2相同,這兩個應該稍後可以在函數foo中使用。

我試圖做這樣的事情:

std::ofstream file1; 
if(hasFile1) 
{ 
    file1 = new std::ofstream(fileName1); 
} 

,但這樣做的問題是,文件1是一個不完整的類型。我嘗試的另一種方法是

std::ofstream* data; 
if(hasFile1) 
{ 
    data = new std::ofstream(fileName1)/std::ofstream(fileName1); 
} 

和所有各種組合的所有或者得到不完整的類型不允許錯誤或我不能分配給指針。

問題的要點是你如何分配一個ofstream,這樣你就不需要維護3塊代碼,這些代碼有不同的組合,其中ofstreams被使用?

任何幫助將不勝感激!

+1

'布爾hasFile1 = fileName1.empty();' - 沒有必要寫4!當一個人會做。 – MSalters

回答

2

「不完整類型」錯誤將是因爲您沒有包括<fstream>以獲得ofstream的定義。

第一個將不起作用,因爲您試圖將一個指針(由new返回)分配給一個對象。在大多數情況下,您可以分配一個對象;但不幸的是,即使通過移動,流也是不可分配的。

第二種方法可行(一旦定義了ofstream),但由於您現在有一個指向動態分配資源的原始指針,因此是一個壞主意。您很可能不會正確刪除它,從而導致內存泄漏或其他問題。

這可以通過使用智能指針而不是原始指針來緩解;但在ofstream的情況下,你可以簡單地離開,如果你沒有一個文件來打開它關閉:

std::ofstream file1; 
if(hasFile1) { 
    file1.open(fileName1); 
} 

此外,要注意,你沒有初始化hasFile1正確;而且通常不能使用==來比較C風格的字符串。你想要的東西更像

bool hasFile1 = (fileName1[0] != '\0'); 

,或者,如果你更改文件名參數傳遞給更友好std::string

bool hasFile1 = !fileName1.empty(); 
+0

編輯這個問題以反映C++類似的字符串,這是一個包含fstream的例子。 – Alex

1

。當你穿過字符串作爲指針,你試圖把它們和其他指針(字面""),這將永遠是真實的(當然,除非,你把這個字符串字面比較""編譯器只保留該特定字符串文字的一個副本,以便指向該文字的指針被共享)。

要麼使用std::string字符串,或者如果你想舊的C風格的字符串指針使用std::strlen檢查空字符串。

0

if(fileName1 == "")const char*的比較可能沒有達到您的預期。它比較兩個const char*指針,而不是它們的值。使用strlen()(檢查零)或strcmp()來比較C字符串。

並且您是否包含fstream

+0

檢查空的C字符串最好做爲'if(!* str)' – bobah

+0

我包含了iostream,所以我想這也包括fstream – Alex

+0

@Alex:看到這個http://stackoverflow.com/questions/2451681/why -do-i-need-to-include-both-iostream-and-fstream-headers-to-open-a-file – fritzone

相關問題