Dev-Cpp中读取文件数据失败

fread() fails to read file data in Dev-Cpp

本文关键字:数据 失败 文件 读取 Dev-Cpp      更新时间:2023-10-16

我遇到了一个奇怪的情况。我使用Dev c++编写了以下程序:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
    FILE *fp;     // edited -- wrong type at first (File)
    unsigned char a, b;
    int c, count, res;      // added "res"
    short int d;
    fp = fopen("record.dat", "r");
    fseek(fp, SEEK_SET, 0);
    count = 0;    // edited -- wrong variable name at first
    res = fread(&a, 1, 1, fp);
    printf("a res = %d, errno %dn", res, errno);
    while(count < 10) {
        count++;
        res = fread(&b, 1, 1, fp);    // added "res =" as mentioned in comment
        printf("b res = %d, errno %dn", res, errno);
        res = fread(&c, 4, 1, fp);    // added "res =" as mentioned in 
        printf("c res = %d, errno %dn", res, errno);
        res = fread(&d, 2, 1, fp);    // added "res =" as mentioned in 
        printf("d res = %d, errno %dn", res, errno);
        res = fread(&a, 1, 1, fp);    // ** where problem starts
        printf("a res = %d, errno %dn", res, errno);
    }
    fclose(fp);
}

"record.dat"文件的大小超过1MB,所以我认为上述程序可以获得前10条记录的数据而没有任何问题(例如不需要处理EOF问题)。然而,当我在Dev c++中编译程序并运行它时,在读取4条记录后,fread()(上面用**标记)返回0,然后while循环内的后续fread()也返回0,这意味着没有数据可以读取。更奇怪的是,所有的errno都是0,当我在Linux中使用g++编译器编译相同的程序时,该程序可以读取同一文件中的所有记录(而不仅仅是10)而没有任何问题。

我错过了什么吗?谢谢!

如果您正在阅读二进制文件,您应该使用"rb"而不是"r"打开它。否则你会得到(特定于平台)"文本模式"处理。在Linux上,这不会改变任何东西,但在Windows上,这将把CR/LF (0D 0A)转换为'n',也可能将^Z解释为文件的结尾。

您可以通过查看文件的十六进制转储来确认这一点:如果您的程序在1A处神秘地停止读取,这就是问题所在。