【发布时间】:2014-09-15 08:03:50
【问题描述】:
我的印象是fstream c++ 中的对象可以用于读取和写入,使用相同的流。
我已经成功地能够先写入流,然后从中读取。但是,如果我再次尝试写入,则文件不会受到影响。
这是一个使用 MinGw 在 windows 上成功编译的代码示例:
int main()
{
std::string path="file.txt";
std::fstream fs(path.c_str());
int buffSize=100;
int bytesRead=0;
char* buffer=new char[buffSize];
fs.write("hello", 5);
fs.seekp(0, std::ios::beg);
fs.read(buffer, buffSize);
bytesRead=fs.gcount();
for(int i=0;i<bytesRead;i++) {std::cout << buffer[i];}
std::cout << "\n";
fs.clear();
fs.seekp(1, std::ios::beg);
fs.write("E", 1);
std::cout << "fail: " << fs.fail() << "\n";
delete[] buffer;
}
“file.txt”的初始内容只有:
AAAAAAA
程序输出:
helloAA
fail: 0
运行程序后在文本编辑器中查看文件显示最终内容为:
helloAA
最后写的“E”没有生效,为什么会这样,如何解决?
编辑:
我尝试使用fs.clear(),然后按照用户 0x499602D2 的建议再次写入。还添加了一行打印出是否设置了故障位或坏位并更新了程序输出。最终文件内容保持不变,但问题仍然存在。
【问题讨论】:
-
clear()第一个read()之后的流。 -
@0x499602D2 单独没有解决它,至少对我来说没有。
-
应该的。读取整个文件设置
eof标志,clear将其清除,因此查找和写入成功。如果您在代码中检查错误,您会看到失败的地方。 -
你有没有试过在写操作后在流对象上调用
flush()?我的猜测是再次写入后数据没有刷新到文件中。