用于读/写的C ++文件流

时间:2016-04-03 15:18:05

标签: c++ filestream fstream

我需要打开一个文件,使用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”。

1 个答案:

答案 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();
      }
   }
}