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

ftellfseek这样的函数在作为二进制流打开的文件上工作一致(更确切地说,行为如预期)。

然而,当一个文件作为文本流打开时(只指定"r"而不是"rb"),就会出现行末和文件末字符转换,从而总是打乱fseekftell的工作方式。