Я использую файлы, pgm.c и pgm.h, чтобы читать в файле изображения PGM, а затем моя программа будет манипулировать файлом (оттенки серого, поворот и т. Д.).Чтение PGM-изображения в C (неверное чтение файла)
Однако я не могу заставить файл правильно читать. Когда я использую:
PGMImage* img = (PGMImage*)malloc(sizeof(PGMImage));
char iName1[256];
printf("Enter the filename of your PGM image:\n");
scanf("%s", iName1);
getPGMfile(iName1, &img);
Консоль возвращает тип, ширину, высоту и максимальное значение изображения. Однако ширина никогда не верна. Обычно это 0 (и один раз это было 56, путь), использую ли я файл .pgm, который я нашел онлайн, или один, который я сделал сам. Я даже пытался жестко кодировать ширину изображения, но даже в этом случае это приводит к сбою программы. Ширина должна быть прочитана в pgm.c, под функцией getPGMfile:
void getPGMfile (char filename[], PGMImage *img)
{
FILE *in_file;
char ch;
int row, col, type;
int ch_int;
in_file = fopen(filename, "r");
if (in_file == NULL)
{
fprintf(stderr, "Error: Unable to open file %s\n\n", filename);
exit(8);
}
printf("\nReading image file: %s\n", filename);
/*determine pgm image type (only type three can be used)*/
ch = getc(in_file);
if(ch != 'P')
{
printf("ERROR(1): Not valid pgm/ppm file type\n");
exit(1);
}
ch = getc(in_file);
/*convert the one digit integer currently represented as a character to
an integer(48 == '0')*/
type = ch - 48;
printf("Type: %d", type);
if((type != 2) && (type != 3) && (type != 5) && (type != 6))
{
printf("ERROR(2): Not valid pgm/ppm file type\n");
exit(1);
}
while(getc(in_file) != '\n'); /* skip to end of line*/
while (getc(in_file) == '#') /* skip comment lines */
{
while (getc(in_file) != '\n'); /* skip to end of comment line */
}
/*there seems to be a difference between color and b/w. This line is needed
by b/w but doesn't effect color reading...*/
fseek(in_file, -1, SEEK_CUR); /* backup one character*/
fscanf(in_file,"%d", &((*img).width));
fscanf(in_file,"%d", &((*img).height));
fscanf(in_file,"%d", &((*img).maxVal));
//I omitted the rest, but it can be seen in the link above
Я понятия не имею, что вызывает эти ошибки. Я использую Eclipse и MinGW GCC для Windows 7 (64-разрядная версия). Мой инструктор не мог помочь мне решить эту проблему, поэтому я надеюсь, что вы сможете! :)
Резюмировать: Ширина изображения PGM всегда читается некорректно, после чего все, что происходит с файлом, заставляет исполняемый файл перестать работать. Жесткое кодирование ширины также приводит к тому, что исполняемый файл перестает работать.
getpgm не должен быть передан адрес указателя, а просто указатель в соответствии с файлом заголовка: getPGMfile (iName1, img) – Magn3s1um
Вам не разрешено использовать вызовы функций, предоставляемые netpbm http://netpbm.sourceforge.net/doc/libnetpbm.html –
@ Magn3s1um: +1, за исключением того, что это ответ, потому что он правильный. – rici