Почему эта функция не работает с этим другим? - PullRequest
0 голосов
/ 02 июля 2018

Я тестирую некоторые функции для задания, но у меня возникают проблемы с этими:

int countall(*FILE f) {
    int value = 0;
    char ch;
    while((ch = fgetc(arquivo)) != EOF) {
        value++;
    }
    return value;
}

int countchar(FILE *f) {
    int count = 0;
    char ch;
    while ((ch = fgetc(f)) != EOF) {
        if (ch >= 'A' && ch <= 'Z')
            count++;
    }
    return count;
}

Они делают почти то же самое, но когда я возвращаю функции к int переменным и пытаюсь напечатать их на stdout, только первая вызванная показывает правильное значение. Второй всегда показывает 0. Как это исправить?

1 Ответ

0 голосов
/ 02 июля 2018

Если вы достигнете конца файла, это условие не будет «волшебным образом» изменяться. Обе ваши функции читают до конца, поэтому вам нужно явно сбросить указатель файла, если вы хотите вызвать их оба для одного и того же открытого файла:

rewind(f);

Подробнее о позиционировании указателя файла см., Например, справочная страница на fseek.


Дополнительные примечания:

  1. Для позиционирования указателя файла требуется файл с возможностью поиска, например, это не тот случай, если ваш FILE * равен stdin.
  2. В вашем коде есть ошибка: объявив ch как char, вы преобразуете все int s, возвращенные fgetc(), в char. Это приведет к проблемам при проверке EOF, скорее всего, вы ошибочно интерпретируете некоторые нормальные символы как конец файла.
  3. int также не является хорошим выбором для подсчета размера. Я предлагаю использовать по крайней мере size_t или, возможно, unsigned long long.
  4. В комментариях уже упоминалось о более "мелких" проблемах, таких как некорректное тестирование символов верхнего регистра и (случайно?) Использование глобальной переменной в одной из ваших функций вместо FILE *, передаваемого в качестве параметра.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...