Как изменить мою функцию, чтобы весь заголовок можно было проанализировать в новом файле? - PullRequest
0 голосов
/ 06 декабря 2018

Итак, я создал функцию, способную извлечь заголовок из файла и поместить его в новый файл без комментариев.Все файлы .ppm имеют максимальное значение цвета 255, так что вот моя функция:

void headerinfo(FILE *infile, FILE *outfile){

    char line[100];
    int c;

    fgets(line,100,infile);
    c=strlen(line);

    while(line[c]!='\n' && line[c-1]!='5' && line[c-2]!='5' && line[c-3]!='2'){
            if(line[0]=='#'){
                    fgets(line,100,infile);
                    c=strlen(line);
            }
            else{
                    fputs(line,outfile);
                    fgets(line,100,infile);
                    c=strlen(line);
                 }
        }
        fputs(line,outfile);
}

Проблема, с которой я сталкиваюсь, состоит в том, что у меня есть два файла .ppm с аналогичными форматами заголовков, но один сРазмеры 561 на 375 не выводят последнюю строку с 255 в новый файл.Есть ли разница между этими двумя файлами, на которые влияет мой код?

Это файл .ppm, который не копируется по строке 255

Вот файл .ppm, который копирует строку 255

.ppm файл, который работает

.ppm файл, который не работает

1 Ответ

0 голосов
/ 06 декабря 2018

Условия while неверны.Поскольку c - это длина строки, line[c] указывает на нулевой символ, который ее заканчивает.Это никогда не может быть '\n'line[c-1] - это '\n', который заканчивает строку (за исключением, возможно, последней строки в файле), поэтому он никогда не будет '5' (если последняя строка не заканчивается на '5').И, конечно, line[c-2] и line[c-3] также находятся вне позиции.

То, что вы действительно хотите:

while (! (4 <= c && line[c-4] == '2' && line[c-3] == '5' && line[c-2] == '5' && line[c-1] == '\n')) {

С некоторыми улучшениями:

void headerinfo(FILE *infile, FILE *outfile)
{
    char line[100];
    size_t c;

    do
    {
        fgets(line, sizeof line, infile);
        c = strlen(line);
        if (line[0] != '#')
            fputs(line, outfile);
    } while (! (4 <= c && strcmp(&line[c-4], "255\n") == 0));
}
...