我有代码块,我在某个周期执行并期望获得具体结果:
代码:
fseek(file, start_seek_position, SEEK_SET);
cout << "Cursor befor fgetc: " << ftell(file) << endl;
fgetc(file);
cout << "Cursor after fgetc: " << ftell(file) << endl << endl;
Expections:
Cursor befor fgetc: 76
Cursor after fgetc: 77
Cursor befor fgetc: 120
Cursor after fgetc: 121
Cursor befor fgetc: 170
Cursor after fgetc: 171
真实结果:
Cursor befor fgetc: 76
Cursor after fgetc: 44
Cursor befor fgetc: 120
Cursor after fgetc: 94
Cursor befor fgetc: 170
Cursor after fgetc: 151
为什么会这样?我认为 fgetc 应该将光标位置向前移动一个。
答案 0 :(得分:3)
问题可能是您以文本模式而不是二进制模式打开文件。所以不要这样:
file = fopen(file_name, "r"); // open as text
它应该是这样的:
#include <cstdio>
file = fopen(file_name, "rb"); // open as binary stream, not text
ftell
和fseek
等函数在作为二进制流打开的文件中始终如一地工作(更重要的是 - 表现得如预期)。
但是,当文件作为文本流打开时(仅指定"r"
而不是"rb"
),将会出现行尾和字符结束的字符翻译,因此总是抛弃fseek
和ftell
的工作方式。