逐字节读取pgm文件会获得corupted数据

时间:2015-08-03 22:11:04

标签: c pgm

    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。

而不是像enter image description here

那样阅读图像

我是这样的

enter image description here

我该如何解决这个问题?

编辑:这是pgm的定义:

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

1 个答案:

答案 0 :(得分:0)

如果您使用的是Windows,则需要确保以二进制模式打开文件。否则,碰巧具有值26(0x1A)的字节将被解释为文件的结尾,之后将不再读取其他字节。 (还将进行其他修改,这将产生其他问题。)

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

检查fscanf的返回值也很重要。

Fscanf是一种阅读二进制文件的可怕方式,因为它的价值。如果您的老师告诉您这样做,您可能希望与他讨论良好的编程实践。