为什么fread()函数读取后,光标会跳转到随机位置?

问题描述 投票:0回答:2

我正在尝试使用

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 个字节。我哪里错了?

c filestream
2个回答
0
投票

对于以文本模式打开的流,

ftell()
返回的数字不一定是距文件开头的字节偏移量,因为遗留系统上存在行尾转换和其他潜在的转换。在 UNIX 系统上,所有运行都应该得到
10
(如果文件较短,则得到更少),或者如果使用
"rb"
以二进制模式打开文件。


0
投票

@mozhayaka 我想,你不妨使用

"rb"
模式而不是
"r"
。当您以文本模式
"r"
打开文件时,在某些系统上,文件中的换行符
'\n'
会自动转换为适合该系统的换行符。

因此将您的

fopen
行更改为:

FILE* in = fopen(argv[1], "rb");

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.