Должны ли вы написать это для задания, или это для удовольствия, или вы могли бы использовать чужой код?
Существует решение с открытым исходным кодом.«Netpbm - это пакет графических программ и библиотека программирования.», Которая включает в себя программы для чтения PPM на http://netpbm.sourceforge.net/doc/
Редактировать: Вы получили или прочитали определение формата файла, например, http://netpbm.sourceforge.net/doc/ppm.html?
Похоже, что данные представляют собой либо последовательности трехбайтовых RGB-троек, либо последовательности двухбайтовых RGB-троек.
Программа может определить, какой формат используется из пункта 7 «Максимальное значение цвета (Maxval)».Там написано: «Если Maxval меньше 256, это 1 байт. В противном случае это 2 байта».
Таким образом, вы кодируете функцию, которая читает данные RGB одного байта / компонента, а затем кодируете другую, чтобы прочитать данные RGB двух байтов / компонента.
Программа может выбрать, какой вызов вызывать после прочтения значения Maxval.
Редактировать {
Согласно документу по этой ссылке, данные изображения в виде 'P6 'ppm является двоичным.
Таким образом, если MaxValue <256 и, следовательно, данные для каждого компонента цвета составляют один байт, то чтение трех байтов с тремя вызовами fgetc (fp) вернет двоичное значение одного пикселя RGB. </p>
Если программа прочитала заголовок, он имеет значения ширины и высоты для данных изображения.Таким образом, он может выделить массив для каждой строки (ширина по ширине пикселей RGB) и массив указателей на каждый выделенный массив строк пикселей.Затем считайте двоичные данные в каждую строку, и программе есть что-то простое для работы;2d массив.
} end edit
Мое чтение вашего вопроса показывает, что вы уже знаете, как читать однобайтовые данные, используя fgetc.
Редактировать - кажется, что это не имеет значения: вы можете прочитать двухбайтовые данные, дважды вызвав fgetc и сдвигая и разбивая данные, например (частично игнорируя проверку ошибок):
int a = fgetc(fp);
int b = fgetc(fp);
if (a >= 0 && b >= 0) { // then all is okay
unsigned int twobyte = (a<<8) | b; // or (b<<8) | a; depending on byte order
// ...