2015-08-03 3 views
0
int i, j; 
    for (i = (*pgm).height - 1; i >= 0; i--) 
     for (j = 0; j < (*pgm).width; j++) 
     { 
      fscanf(file, "%c", &(*pgm).data[i][j]); 
     } 
} 

Это часть моей функции для чтения байта файла PGM by byte. В этом для, после что-то вроде 2000 байт, каждый байт, который он читает 0.Чтение файла pgm byte by byte получает поврежденные данные

Вместо того, чтобы читать изображения, как этот enter image description here

Я понимаю, как этот

enter image description here

Как могу я решить это?

Edit: это определение платиноидов:

typedef struct PGM 
{ 
    int width; 
    int height; 
    int maxValue; 
    unsigned char data[500][500]; 
} PGM; 
+1

Почему вы пишете '(* pgm) .foo' вместо' pgm-> foo'? Как определяется и инициализируется 'pgm-> data? – rici

+0

так учил мой учитель. Я поставил определение pgm в сообщение. Он инициализируется как PGM pgm; –

+2

ваш учитель должен иметь достаточно веские причины для чтения файла изображения таким ужасным способом (по одному байту за раз и с помощью fscanf!). Скажите ему/ей, чтобы читать хотя бы одну линию изображения за раз (например, используя 'fread') и избегать разбора ввода. Это двоичный файл после всех – Pynchia

ответ

0

Если вы используете Windows, вы должны убедиться, что вы открываете файл в двоичном режиме. В противном случае байт, который имеет значение 26 (0x1A), будет интерпретироваться как конец файла, после чего последующие байты не будут прочитаны. (Другие изменения также будут сделаны, что вызовет другие проблемы.)

На любой ОС лучше всего открыть двоичные файлы в двоичном режиме, но в Windows это очень важно.

Также важно проверить возвращаемое значение fscanf.

Fscanf - это ужасный способ чтения двоичного файла, для чего его стоит. Если ваш учитель сказал вам сделать это, вы можете поговорить с ним о хорошей практике программирования.

Смежные вопросы