1

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

4 に答える 4

2

ヘッダーがデータのサイズを示していると仮定して、十分な大きさのメモリブロックを割り当て、fread()を使用して1回の呼び出しでデータを読み取ります。これは、一度に1バイトを読み取るよりもはるかに高速です。

  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

netpbmライブラリを使用しない理由はありますか?

于 2011-03-07T07:09:22.797 に答える
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エンコーディング(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 に答える