我正在尝试读取二进制文件并以块的形式写入多个输出文件。假设总共有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();
}
答案 0 :(得分:3)
问题很可能是您使用while (!fin.eof())
。在之后尝试从文件末尾读取之后,才会设置eofbit
标志。这意味着循环将循环一次额外的时间而不需要注意。
相反,您应该记住所有输入操作都返回流对象,并且该流对象可以用作布尔条件。这意味着你可以这样做:
while (fin.read(...))
这可以避免在!fin.eof()
时循环问题。
并在标题中回答您的问题:是的,当您成功阅读任何内容时,文件位置会被移动。如果读取X字节,读取位置也将向前移动X字节。