读取ppm文件并使用fscanf()

时间:2011-03-07 02:36:11

标签: c ppm

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

P3
100 100
255
data...

p3
100 100
255
data...

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

4 个答案:

答案 0 :(得分:2)

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

  unsigned char *data = malloc(width*height); // or whaterver size
  fread(file_stream,width*height,1,data);

答案 1 :(得分:1)

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

答案 2 :(得分:0)

有没有理由不使用netpbm库?

答案 3 :(得分:0)

使用fscanf,您可以使用"%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编码的ppm文件(P1,P2或P3),fscanf是一个非常好的选择。

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

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

fopen(filename, "rb");