Чтение ppm-файлов и использование fscanf () - PullRequest
1 голос
/ 07 марта 2011

Я пытаюсь разобрать файл ppm, но сначала нужно проверить правильность информации заголовка.Файл ppm может иметь следующие форматы:

P3<br> 100 100<br> 255<br> data...

или

p3<br> 100 100<br> 255<br> data...

Я использую fscanf (file_stream, "P3 %d %d %d", &width, &height, &max_colour); для проверкиинформация заголовкаЯ хотел бы знать, как перейти к чтению данных (char на char) после проверки информации заголовка.

Ответы [ 4 ]

2 голосов
/ 07 марта 2011

Предполагая, что заголовок сообщает вам размер данных, затем выделите достаточно большой блок памяти и используйте fread () для чтения его за один вызов - это НАМНОГО быстрее, чем чтение байта за раз.

  unsigned char *data = malloc(width*height); // or whaterver size
  fread(file_stream,width*height,1,data);
1 голос
/ 07 марта 2011

Добавьте %*[\n] в конец вашей строки fscanf, чтобы съесть последнюю новую строку в заголовке, затем вы можете использовать fread для чтения необработанных байтов из оставшейся части файла (при условии, что вы открыли его в двоичном виде режим).

0 голосов
/ 07 марта 2011

Используя 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 */
}

Но, предполагаяфайл ppm с кодировкой ASCII (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");
0 голосов
/ 07 марта 2011

Есть ли основания не использовать библиотеку netpbm ?

...