读取二进制整数后,fstream移动到下一个位置(c ++)

时间:2014-04-04 16:27:36

标签: c++ binary fstream

我正在尝试读取二进制文件并以块的形式写入多个输出文件。假设总共有25个4byte数字,并且块大小设置为20,程序将生成两个输出文件,一个带有20个整数,另一个带有5个。但是如果我有一个40个整数的输入文件,我的程序会生成三个文件,前两个文件都有20个数字,但是第三个文件有一个数字,它是输入文件中的最后一个,它已经包含在第二个输出文件中。每次读取数字时,如何强制读取位置向前移动?

  ifstream fin("in.txt", ios::in | ios::binary);
  if(fin.is_open())
    {
      while(!fin.eof()){
        //set file name for each output file                                                                  
        fname[0] = 0;
        strcpy(fname, "binary_chunk");
        index[0] = 0;
        sprintf(index, "%d", fcount);
        strcat(fname, index);

        // open output file to write                                                                          
        fout.open(fname);

        for(i = 0; i < chunk; i++)
          {
            fin.read((char *)(&num), INT_SIZE);
            fout << num << "\n";

            if(fin.eof())
              {
                fout.close();
                fin.close();
                return;
              }
          }
        fcount ++;
        fout.close();
      }
      fout.close();
    }

1 个答案:

答案 0 :(得分:3)

问题很可能是您使用while (!fin.eof())。在之后尝试从文件末尾读取之后,才会设置eofbit标志。这意味着循环将循环一次额外的时间而不需要注意。

相反,您应该记住所有输入操作都返回流对象,并且该流对象可以用作布尔条件。这意味着你可以这样做:

while (fin.read(...))

这可以避免在!fin.eof()时循环问题。

并在标题中回答您的问题:是的,当您成功阅读任何内容时,文件位置会被移动。如果读取X字节,读取位置也将向前移动X字节。