1

我正在尝试解析 ppm 文件,但首先需要验证标头信息是否正确。一个 ppm 文件可能有以下格式:

P3
100 100
255
data...

或者

p3
100 100
255
data...

fscanf (file_stream, "P3 %d %d %d", &width, &height, &max_colour);用来验证标题信息。我想知道的是,如何在验证标头信息后继续读取数据( charby )。char

4

4 回答 4

2

假设标头告诉您数据的大小,然后分配一个足够大的内存块并使用 fread() 在一次调用中读取它 - 这比一次读取一个字节要快得多。

  unsigned char *data = malloc(width*height); // or whaterver size
  fread(file_stream,width*height,1,data);
于 2011-03-07T02:46:57.310 回答
1

%*[\n]在字符串的末尾添加 a以fscanf吃掉标题中的最后一个换行符,然后您可以使用fread从文件的其余部分读取原始字节(假设您以二进制模式打开它)。

于 2011-03-07T02:46:11.927 回答
0

使用fscanf您可以读取 char "%c"

char ch;
while (fscanf(file_stream, "%c", &ch) == 1) {
    /* process ch */
}

但是fscanf你可以使用fgetc()

int ch;
while ((ch = fgetc(file_stream)) != EOF) {
    /* process ch */
}

但是,假设使用 ASCII 编码(P1、P2 或 P3)的 ppm 文件fscanf是一个非常好的选择。

/* P3 format */
if (fscanf(file_stream, "%d%d%d", &red, &green, &blue) == 3) {
    /* RGB triplet read; process it */
}

如果要处理二进制 PPM,请记住以二进制模式打开文件

fopen(filename, "rb");
于 2011-03-07T09:29:18.590 回答
0

有什么理由不使用netpbm库吗?

于 2011-03-07T07:09:22.797 回答