我正在尝试解析ppm文件,但首先需要验证标头信息是否正确 . ppm文件可能具有以下格式:
P3 100 100 255 data...
要么
p3 100 100 255 data...
我正在使用 fscanf (file_stream, "P3 %d %d %d", &width, &height, &max_colour); 来验证标头信息 . 我想知道的是,如何在验证 Headers 信息后继续读取数据( char , char ) .
fscanf (file_stream, "P3 %d %d %d", &width, &height, &max_colour);
char
使用 fscanf ,您可以使用 "%c" 读取字符 .
fscanf
"%c"
char ch; while (fscanf(file_stream, "%c", &ch) == 1) { /* process ch */ }
但不是 fscanf 而是 fgetc()
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 */ }
Remember to open your file in binary mode if you want to deal with binary PPMs
fopen(filename, "rb");
有没有理由不使用netpbm库?
将 %*[\n] 添加到 fscanf 字符串的末尾以使用 Headers 中的最后一个换行符,然后您可以使用 fread 从文件的其余部分读取原始字节(假设您以二进制模式打开它) .
%*[\n]
fread
假设 Headers 告诉你数据的大小,那么分配一个足够大的内存块并使用fread()在一次调用中读取它 - 这比一次读取一个字节要快得多 .
unsigned char *data = malloc(width*height); // or whaterver size fread(file_stream,width*height,1,data);
4 回答
使用
fscanf
,您可以使用"%c"
读取字符 .但不是
fscanf
而是fgetc()
但是,假设使用ASCII编码的ppm文件(P1,P2或P3),
fscanf
是一个非常好的选择 .Remember to open your file in binary mode if you want to deal with binary PPMs
有没有理由不使用netpbm库?
将
%*[\n]
添加到fscanf
字符串的末尾以使用 Headers 中的最后一个换行符,然后您可以使用fread
从文件的其余部分读取原始字节(假设您以二进制模式打开它) .假设 Headers 告诉你数据的大小,那么分配一个足够大的内存块并使用fread()在一次调用中读取它 - 这比一次读取一个字节要快得多 .