我正在尝试使用
fread()
从文件中读取二进制数据,但读取后,文件流的当前位置在某种程度上取决于我正在读取的文件。
我使用不同的输入文件运行这个简单的代码:
#include <stdio.h>
int main(int argc, char** argv) {
FILE* in = fopen(argv[1], "r");
char buff[10];
fseek(in, 0, SEEK_SET);
fread(buff, sizeof(char), 10, in);
printf("Final position: %d\n", (int)ftell(in));
return 0;
}
控制台(我在 Windows 上运行它,来自 MinGW 的 g++.exe 编译器):
$ ./p.exe test_data/test_elf
Final position: 692
$ ./p.exe test_data/test.cc
Final position: 11
$ ./p.exe example.txt
Final position: 9
我预计最终位置为 10,因为我们从 0 开始读取 10 个字节。我哪里错了?
对于以文本模式打开的流,
ftell()
返回的数字不一定是距文件开头的字节偏移量,因为遗留系统上存在行尾转换和其他潜在的转换。在 UNIX 系统上,所有运行都应该得到 10
(如果文件较短,则得到更少),或者如果使用 "rb"
以二进制模式打开文件。
@mozhayaka 我想,你不妨使用
"rb"
模式而不是"r"
。当您以文本模式 "r"
打开文件时,在某些系统上,文件中的换行符 '\n'
会自动转换为适合该系统的换行符。
因此将您的
fopen
行更改为:
FILE* in = fopen(argv[1], "rb");
希望对您有帮助。