2010-09-13 199 views
1

我正在做的是在主开始时使用fstream打开我的文件,并在最后关闭它。在我写作“Hello World”之间,然后阅读我写的内容,但结果总是被人嘲笑,而不是“Hello World”。我确实做了一个角色,但没有帮助。任何方式我可以做到这一点?同时读取/写入

+1

您是否检查读取操作是否成功?你如何阅读? – 2010-09-13 04:12:53

+4

发布您使用的代码。 – 2010-09-13 04:12:59

回答

2

当您从阅读转为写作或反之时,您需要设置一个fseek调用。 (当然,你也需要fopen"r+"之类的,所以读写都是允许的,但我想你已经知道了 - 寻求在阅读和写作之间切换的需要是一个鲜为人知的事实)。

作为this page所说的那样,

对于模式,其中读取和 写入(或附加)被允许 (那些包括“+”符号),则 流应该被刷新(fflush )或 重新定位(FSEEK,fsetpos,倒带) 任一随后的写入操作的读出操作 或 写入操作之后是 读取操作之间。

+0

fseek和fstream?我不这么认为。这个问题被标记为C++而不是C,所以C++的答案会更合适。 – camh 2010-09-13 04:30:25

+0

@camh,在我的回答中,我从“cplusplus.com”引用了大量的内容:这不是我的错(当然也不是'cplusplus.com'的人;-) C++将(C的一个版本)合并为一个子集,因此这个答案工作得很好(而@麦克的回答指出,用'std :: fstream'做这件事不是那么容易)。如果你认为有更好的方法来做到这一点(使用'std :: fstream'和w/o'fopen'),为什么不把它发布呢? – 2010-09-13 05:04:27

+0

如果我认为你的答案有问题,我会对此做出评论,就像我所做的那样。我不需要张贴我自己的答案参与。你不能混用iostream和stdio,所以你的回答最好是不相关的(stdio与iostreams的问题无关),最坏的情况是错误的。 C++包含C子集并不意味着在纯C++程序中使用该子集是一个好主意。不是异常安全的(除非你编写自己的包装,否则不会自动关闭已打开的文件)足以让我不鼓励在纯C++代码中使用此C子集。 – camh 2010-09-13 07:18:45

1

我想如果这个工程,逗乐,因为我总是要打开一个文件两次做到这一点:一次读取和一次写。即使那样,我也必须写出整个文件并关闭它(刷新操作系统缓冲区),然后才能确定我能读取整个文件,而不是早期的EOF。

时下,因为我使用Unix风格的操作系统,我只会使用pipe()函数。不知道这是否可以在Windows中使用(因为很多不如文件上的select())。

1

确保你正在寻找的文件的开头读,像这样前:

fileFStream.seekg(0, ios_base::beg); 

如果不工作,发布您的代码。