Как узнать количество символов в каждой строке? - PullRequest
0 голосов
/ 24 мая 2019

Мне нужно получить количество символов в каждой строке, а затем вставить его в другой файл (школьный проект), но даже мой прототип уже не работает.

Я уже пытался продолжить видеть, решается ли проблема, когдаЯ вставил его в другой файл, но он не сработал, поэтому я вернулся к этому.

int main()
{
    FILE *fw;
    FILE *fr;
    int i = 0;
    char c;
    fr = fopen("vstup.txt","r");
    fw = fopen("vystup.txt","w");
    while ((c = getc(fr)) != EOF)
    {
        while ((c = getc(fr)) != '\n')
        {
            i++;
        }
        printf("%d\n", i);
    }
}

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

c должно быть объявлено int, а не char.EOF может быть недопустимым char значением, поэтому неравенство может преуспеть навсегда.

Не следует дважды вызывать getc().Вы никогда не проверяете результат первого вызова, чтобы увидеть, является ли это новой строкой.

Вам необходимо установить i обратно на 0 после прочтения новой строки, в противном случае вы будете продолжать добавлять длину следующей строкина предыдущую строку.

Вы должны печатать длину только при чтении новой строки, а не каждый раз через цикл.И если последняя строка не заканчивается новой строкой, вы должны вывести ее длину после цикла;вы можете сказать, что это произошло, если i не равно 0, когда это будет сделано.

Поскольку длины должны быть записаны в другой файл, вы должны использовать fprintf().

while ((c=getc(fr)) != EOF) {
    if (c == '\n') {
        printf("%d\n", i);
        i = 0;
    } else {
        i++;
    }
}
if (i != 0) {
    fprintf(fw, "%d\n", i);
}
1 голос
/ 24 мая 2019

Вам не нужен вложенный цикл.Вам нужно обнулить счетчик в любом случае, поэтому вы можете просто использовать if вместо времени:

int main()
{
    FILE *fw, *fr;
    int count = 0;
    int c;

    fr = fopen("vstup.txt","r");
    fw = fopen("vystup.txt","w");

    while ((c = getc(fr)) != EOF) {
        count++;
        if(c == '\n') {
            fprintf(fw, "%d\n", count);
            count = 0;
        }
    }

    fclose(fr);
    fclose(fw);
}

В этой версии новые строки будут считаться действительными символами.

Обратите внимание, что c должно быть int, а не char, так что он может содержать каждое символьное значение, возвращаемое getc, а также EOF, который не является символьным значением.

И не забудьте закрыть свои файлы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...