fgetc的奇怪行为

时间:2015-11-02 16:53:31

标签: c++ io

我有代码块,我在某个周期执行并期望获得具体结果:

代码:

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 应该将光标位置向前移动一个。

1 个答案:

答案 0 :(得分:3)

问题可能是您以文本模式而不是二进制模式打开文件。所以不要这样:

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的工作方式。