fget (c) - сканирование следующего символа с сохранением предыдущего

Я пытаюсь создать программу, которая читает файл и подсчитывает количество слов, начинающихся с 'a'.

Моя идея:

  • Отсканируйте символ, посмотрите, буквенный ли он.

  • Если это не так, я буду знать, что следующий символ - это новое слово

  • Просканируйте следующий символ, чтобы проверить, является ли он 'a' или 'A'

Я хотел бы знать, есть ли простой способ отсканировать следующий символ, используя fgetc(), при этом запомнив предыдущий.

Что-то вроде:

char letter;
int aCount = 0;

while ((letter = fgetc(testFile)) != EOF) {

    if (isalpha(letter) == false && ('nextCharacter' == 'a' || 'nextCharacter' == 'A')) {

        aCount++; 
    }
}

Спасибо заранее.


person Community    schedule 04.01.2016    source источник
comment
Вот для чего нужны переменные: запомнить значение. Но fgetc возвращает int, а не char по уважительной причине! Пожалуйста, прочтите справочные страницы functions.   -  person too honest for this site    schedule 04.01.2016
comment
Эй, это пример, где 'nextcharacter' - это переменная, содержащая следующий символ найденного слова   -  person Phiter    schedule 04.01.2016
comment
код недействителен, как он сказал Что-то вроде;   -  person Phiter    schedule 04.01.2016
comment
Для хранения почему бы не использовать массив и не перебирать его.   -  person ameyCU    schedule 04.01.2016
comment
Итак, мне нужно объявить новую переменную с именем, скажем, «prevChar», и добавить реализацию, например, if islapha (letter) == false {prevChar == letter}, и двигаться дальше?   -  person    schedule 04.01.2016
comment
Подсказка: lastLetter =letter;   -  person stark    schedule 04.01.2016
comment
Хорошо, всем большое спасибо, теперь я думаю, понимаю. Ваша помощь очень ценится.   -  person    schedule 04.01.2016


Ответы (1)


С вашим кодом есть несколько проблем:

  • байты, считанные из файла, должны быть сохранены в переменной int для размещения EOF и всех значений символов без знака. Если вы сохраните его в char переменной, вы не сможете надежно проверить EOF.
  • вы должны сохранить предыдущий байт, чтобы проверить начало слова, и использовать letter, чтобы проверить, начинается ли текущее слово с 'a' или 'A'.

Вот исправленная версия:

int prev = ' '; // pretend there is a non letter before the first byte.
int c;
int aCount = 0;

while ((c = fgetc(testFile)) != EOF) {

    if (!isalpha(prev) && (c == 'a' || c == 'A')) {
        aCount++; 
    }
    prev = c;
}
printf("there are %d words starting with 'a'\n", aCount);
person chqrlie    schedule 04.01.2016
comment
Спасибо за помощь, я думаю, что моя основная проблема заключалась в том, что я думал, что fgetc () вернул char, а не int. - person ; 04.01.2016
comment
int c; while ((c = fgetc(testFile)) != EOF) { ... } - это очень идиоматический способ синтаксического анализа потока байт за байтом. - person chqrlie; 04.01.2016