我的印象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;
}
&#34; file.txt&#34;的初始内容只是:
AAAAAAA
程序输出:
helloAA
fail: 0
运行程序后在文本编辑器中查看文件显示最终内容为:
helloAA
&#34; E&#34;的最后写作尚未生效,为什么会这样,我该如何解决?
修改
我尝试使用fs.clear()
再次写入用户0x499602D2建议。还添加了一行打印出是否已设置failbit或badbit并更新程序输出。最终文件内容保持不变,但问题仍然存在。
答案 0 :(得分:1)
(我在问题评论中发表的更详细的答案)
您需要在输出流对象(从ostream派生)上调用flush()
,以便将数据实际写入输出流。有关flush()
的更多信息可用on this c++ reference page。
答案 1 :(得分:0)
这项工作在GCC 4.9.0和VS2013中进行。
注意:
在行fs.seekp(0, std::ios::beg);
中的示例代码中需要搜索。没有问题,因为读指针没有移动(直到那里才读取)。
代码:
#include <algorithm>
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[]) {
std::string path = "H:\\save.txt";
int buffSize = 100;
int bytesRead = 0;
char* buffer = new char[buffSize];
std::fstream fs(path.c_str());
fs.write("hello", 5);
fs.flush(); // flushing to disk file
fs.seekg(0, std::ios_base::beg); // moving the read pointer
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);
fs.flush(); // flushing to disk file
std::cout << "fail: " << fs.fail() << "\n";
delete[] buffer;
return 0;
}
答案 2 :(得分:0)
string data="";
string Newdata="New Data";
std::fstream output_file(fileName, ios::in| ios::out);
output_file >> data; //read Data
output_file.seekg( 0, ios::beg );//set point to zero
output_file<<Newdata<<"\n"; //write new Data
output_file.close();
答案 3 :(得分:0)
使用fstream读取文件后,tellg <读取指针>和tellp <写入指针>指向-1。 为了能够再次使用fstream进行写入,只需调用fstream.clear(),它将把读写指针重置为读取之前的位置。
以上解决方案均不起作用,但fstream.clear()起作用。