C fread不是从文件的开头开始的

C fread不是从文件的开头开始的,c,file-io,stream,fread,C,File Io,Stream,Fread,我正在从事一个项目,该项目涉及将二进制数据从文件读入特定的数据结构。在测试时,我看到错误的数据被加载到这些结构中。使用ftell添加一点调试代码表明fread不是从文件的开头开始的,而是在数百字节深的某个偏移处开始的。这可能是什么原因造成的 我已尝试添加fseekinfile、0、SEEK_集;在第一个fread调用之前,但第一个调用仍然以与之前相同的偏移量开始。我也尝试过使用rewinfile,但没有效果。我确实看到这个问题是否发生取决于正在读取的文件。某些文件总是从位置0开始,而其他文件总是

我正在从事一个项目,该项目涉及将二进制数据从文件读入特定的数据结构。在测试时,我看到错误的数据被加载到这些结构中。使用ftell添加一点调试代码表明fread不是从文件的开头开始的,而是在数百字节深的某个偏移处开始的。这可能是什么原因造成的

我已尝试添加fseekinfile、0、SEEK_集;在第一个fread调用之前,但第一个调用仍然以与之前相同的偏移量开始。我也尝试过使用rewinfile,但没有效果。我确实看到这个问题是否发生取决于正在读取的文件。某些文件总是从位置0开始,而其他文件总是从其他偏移开始

下面是一个在我的机器上显示此问题的代码示例。我目前运行的是Windows10,代码是在VisualStudio中编译的

#include <stdio.h>


int main(int argc, char* argv[]) {

    FILE* infile;
    char* inname;
    char x;

    inname = argv[1];

    if ( (fopen_s(&infile, inname, "r")) != 0) {
        printf("Error opening file: %s\n", inname);
        exit(1);
    }

    if (infile == 0) {
        printf("Error opening file.\n");
        exit(1);
    }


    while (fread(&x, sizeof(char), 1, infile) == 1) {
        printf("%ld\n", ftell(infile));
        printf("%hhx\n\n", x);
    }


    fclose(infile);

    return 0;
}

您应该以二进制读取模式打开文件

if ( (fopen_s(&infile, inname, "r")) != 0) {

模式字符串还可以包含字母“b”作为最后一个字母 字符,或作为任何字符中字符之间的字符 上面描述的两个字符串。这完全是为了 与C89兼容,无任何影响;“b”在所有的位置都被忽略 符合POSIX标准的系统,包括Linux。其他系统可能会处理 文本文件和二进制文件不同,添加“b”可能是一个错误 如果您对二进制文件进行I/O,并希望您的程序 可以移植到非UNIX环境


您应该以二进制读取模式打开文件

if ( (fopen_s(&infile, inname, "r")) != 0) {

模式字符串还可以包含字母“b”作为最后一个字母 字符,或作为任何字符中字符之间的字符 上面描述的两个字符串。这完全是为了 与C89兼容,无任何影响;“b”在所有的位置都被忽略 符合POSIX标准的系统,包括Linux。其他系统可能会处理 文本文件和二进制文件不同,添加“b”可能是一个错误 如果您对二进制文件进行I/O,并希望您的程序 可以移植到非UNIX环境


发布输出。发布输出。@kansas_bulldog382乐于帮助:@kansas_bulldog382乐于帮助: