繁体   English   中英

读取ppm文件并使用fscanf()

[英]Reading ppm files and using fscanf()

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

P3
100 100
255
data...

要么

p3
100 100
255
data...

我正在使用fscanf (file_stream, "P3 %d %d %d", &width, &height, &max_colour); 验证标题信息。 我想知道的是,如何在移动到读取数据( charchar验证头信息后)。

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

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

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

是否有某些原因不使用netpbm库?

使用fscanf可以读取带有"%c"的字符。

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

但是可以使用fgetc()代替fscanf

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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM