簡體   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