逐字节读取 pgm 文件会损坏数据

Reading pgm file byte by byte gets corupted data

    int i, j;
    for (i = (*pgm).height - 1; i >= 0; i--)
        for (j = 0; j < (*pgm).width; j++)
        { 
            fscanf(file, "%c", &(*pgm).data[i][j]);
        }
}

这是我逐字节读取 PGM 文件的函数的一部分。 在这个 for 中,在大约 2000 个字节之后,它读取的每个字节都是 0.

而不是像这样阅读图像

我是这样理解的

我该如何解决这个问题?

编辑:这是 pgm 的定义:

typedef struct PGM
{
    int width;
    int height;
    int maxValue;
    unsigned char data[500][500];
} PGM;

如果您使用Windows,您需要确保以二进制模式打开文件。否则,恰好值为 26 (0x1A) 的字节将被解释为文件结尾,之后将不会读取更多字节。 (还会做其他修改,会产生其他问题。)

在任何 OS 上,最好以二进制模式打开二进制文件,但在 Windows 上它非常重要。

检查 fscanf 的 return 值也很重要。

Fscanf 是一种糟糕的读取二进制文件的方法,无论其价值如何。如果您的老师告诉您这样做,您可能想与他讨论良好的编程实践。