逐字节读取 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 是一种糟糕的读取二进制文件的方法,无论其价值如何。如果您的老师告诉您这样做,您可能想与他讨论良好的编程实践。
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 是一种糟糕的读取二进制文件的方法,无论其价值如何。如果您的老师告诉您这样做,您可能想与他讨论良好的编程实践。