fgetc的奇怪行为
Strange behavior of fgetc
本文关键字:fgetc 更新时间:2023-10-16
我有一块代码,我在某个周期内执行它,并期望得到具体的结果:
代码:
fseek(file, start_seek_position, SEEK_SET);
cout << "Cursor befor fgetc: " << ftell(file) << endl;
fgetc(file);
cout << "Cursor after fgetc: " << ftell(file) << endl << endl;
预期:
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应该将光标位置向前移动一个。
问题可能是您以文本模式而不是二进制模式打开文件。因此,取而代之的是:
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
的工作方式。