我需要打开一个文件,使用fstream进行读/写,然后读取每个字符,然后将该字符写回文件。例如,我有这个代码。
fstream in("test.txt",ios::in | ios::out);
if(!in)
cout<<"error...";
else
{
char ch;
in.seekg(0,ios::end);
int end=in.tellg();//get the length
in.seekg(0);//get back to the start
for(int i=0;i<end;i++)
{
//in.seekg(in.tellg());//if i uncomment this the code will work
if(!in.get(ch).fail())//read a character
{
in.seekp(static_cast<int>(in.tellg())-1);//move the pointer back to the previously read position,so i could write on it
if(in.put(ch).fail())//write back,this also move position to the next character to be read/write
break;//break on error
}
}
}
我有一个名为"test.txt"
的文件,其中包含“ABCD”。据我所知,流对象的put()
和get()
方法都将文件指针向前移动(我看到每个函数后返回tellg()
或tellp()
函数的返回值get()
或put()
方法调用)。我的问题是当我注释掉将寻找“它现在在哪里”(in.seekg(in.tellg()
)的流指针的代码时,代码将导致错误的结果。我不明白为什么这是因为tellg()
显示了接下来要阅读的角色的正确位置。明确寻求它的目的是什么?我正在使用visual studio 2005.
错误的结果是写入文件“ABBB”而不是“ABCD”。
答案 0 :(得分:0)
在写入和读取之间切换时,必须刷新输出缓冲区。
fstream in("test.txt",ios::in | ios::out);
if(!in)
cout<<"error...";
else
{
char ch;
in.seekg(0,ios::end);
int end=in.tellg();//get the length
in.seekg(0);//get back to the start
for(int i=0;i<end;i++)
{
if(!in.get(ch).fail())//read a character
{
in.seekp(static_cast<int>(in.tellg())-1);//move the pointer back to the previously read position,so i could write on it
if(in.put(ch).fail())//write back,this also move position to the next character to be read/write
break;//break on error
in.flush();
}
}
}