c - fget(c) - 在保存前一个字符的同时扫描下一个字符

标签 c file-io fgetc

我正在尝试创建一个程序来读取文件并计算以 'a' 开头的单词数。

我的想法是:

  • 扫描一个字符,看它是否是字母。

  • 如果不是那么我就知道下一个字符是一个新词

  • 扫描下一个字符以检查它是 'a' 还是 'A'

我想知道是否有一种简单的方法可以使用 fgetc() 扫描下一个字符,同时仍然记得前一个字符。

类似于:

char letter;
int aCount = 0;

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

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

        aCount++; 
    }
}

非常感谢。

最佳答案

你的代码有几个问题:

  • 从文件中读取的字节应存储到 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);

关于c - fget(c) - 在保存前一个字符的同时扫描下一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34590580/

相关文章:

database - 将列表列表保存到文件的最有效方法?

c# - 当用户无权复制文件时使用 UAC 提示

C - 确保用户输入的长度合适

C 从文本文件填充数组

c - 读取系统调用垃圾字符

c - 我怎样才能把它分解成函数?

hh :mm:ss. xxx 毫秒中的 C 程序时间戳和文件处理问题

c++ - 有效地处理调用一百万次的 C/C++ 函数

java - 删除所有文件和子目录,但在 Java 中将当前目录保持为空

c - 读取文件到字符串