2013-04-04 70 views
0

我有一個函數可以獲取ifstream變量,但是我必須在某些情況下寫入這個文件。例如。ifstream - > ofstream C++

main() 
{ 
    ifstream dataFile("filename.txt"); 
    foo(dataFile); 
} 

void foo(ifstream &df) 
{ 
    if(df.good()) {...} 
    else { 
    //here I need to write str into the "filename.txt" 
    //but I don't know how to do it properly! 
    } 
} 

正如我可以想像,最簡單的方法是讓某種方式從DF foo中(文件名)......怎麼會呢?

想象: 我不能使用fstream。 由於某種原因我只有ifstream &不知道文件的名稱。 例如我從某些封閉的庫函數中獲得ifstream &。

+0

不要按值傳遞流,請參考它。 'void foo(ifstream&df)' – andre 2013-04-04 13:15:01

+0

您可以將文件名作爲參數傳遞給foo嗎?如果可以的話,只需在foo中實例化一個std :: ostream(filename)並使用它。否則,你可以用fstream(它同時支持)輸入和輸出來替換ifstream。 – utnapistim 2013-04-04 13:16:13

+2

難道你不能改變函數,所以它需要'fstream'而不是'ifstream'? 'ifstream'專門用於從文件讀取*,而不用於寫入。 – 2013-04-04 13:18:58

回答

4

使用fstream的,而不是ifstream的:

fstream dataFile("filename.txt",ios::in | ios::out | ios::app); 

有了這個,你可以讀取和寫入文件。

和課程,通過引用傳遞你的fstream對象,而不是通過價值。 fstream是不可複製的。

+1

這裏並不適合,也不適用於答案,但在C++ 11中,流是可移動的。 – 2013-04-04 13:23:19

+0

@PeteBecker有趣的知道,謝謝。儘管我沒有看到爲什麼應該通過價值傳遞文件流的原因......但我認爲,由於缺乏經驗,問題中的人物正在傳遞價值。 – 2013-04-04 13:25:37

+0

感謝& - 我知道。錯字。 – 2013-04-04 13:51:20

1

不幸的是,由於您的限制只有一個ifstream且沒有文件名,所以沒有可移植的方式來回寫該文件。

還有可能是不可移植的方式來解決這個問題。例如,某些unix實現可能會在filebuf對象上提供fd函數,您可以從ifstream中的rdbuf獲取該對象。 Windows可能會或可能不會提供類似的功能。

我會注意到它聽起來像你可能在這裏解決了錯誤的問題,你應該至少花一點時間訪問你的設計(以及爲什麼你需要寫一個你不知道的文件名知道)。