2013-04-04 74 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可能会或可能不会提供类似的功能。

我会注意到它听起来像你可能在这里解决了错误的问题,你应该至少花一点时间访问你的设计(以及为什么你需要写一个你不知道的文件名知道)。