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

标签 c filestream

我正在尝试使用 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 个字节。我哪里错了?

更新

这是文件内容:

$ hexdump example.txt 
0000000 3231 3433 3635 3837 3039 6261 6463 6665
0000010 6867 6a69 6c6b 6f6e 7170 7372 7574 7776
0000020 7978 207a 2320 2524 265e 282a e229 9684
0000030 253b 3f3a 282a 7b29 5b7d 0a5d
000003c

$ hexdump test_data/test.cc
0000000 0a0d 7361 286d 6e22 706f 2922 0d3b 610a
0000010 6d73 2228 756c 2069 3278 202c 7830 3031
0000020 2230 3b29 2020 2020 2020 2020 2020 2020
0000030 2020 2f2f 5320 2050 6573 2074 6f74 3120
... (more)

$ hexdump test_data/test_elf
0000000 457f 464c 0101 0001 0000 0000 0000 0000
0000010 0002 00f3 0001 0000 0074 0001 0034 0000
0000020 0334 0000 0000 0000 0034 0020 0002 0028
0000030 0008 0007 0001 0000 0000 0000 0000 0001
... (more)

最佳答案

@mozhayaka 我认为,你不妨使用 "rb" 模式而不是 "r"。当您以文本模式 "r" 打开文件时,在某些系统上,文件中的换行符 '\n' 会自动转换为相应的换行符序列系统。

因此将您的 fopen 行更改为:

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

希望对您有所帮助。

关于c - 为什么fread()函数读取后,光标会跳转到随机位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77679583/

相关文章:

c - 改变结构的大小?

delphi - TStringList.LoadFromFile - 大文本文件的异常

c - 通过C程序获取Linux中的网络接口(interface)类型

c# - FileStream.Flush() 和 FileStream.Flush(True) 有什么区别?

javascript - 使用 csv-parse 和 Node 在读取和解析文件中添加快速随机访问

c# - 文件流创建或追加问题

node.js - 如何使用nodejs将对象保存在文件中

c++ - 我怎样才能让 Doxygen 知道 CUDA 内核调用?

c++ - 具有 extern #define 和 typedef 结构的静态库

c - 声明结构类型,将值插入到该类型的数组中,然后打印出数组