为什么此功能不能与其他功能一起使用?

时间:2018-07-02 12:19:10

标签: c function file

我正在测试某些功能以进行分配,但是我在使用这些功能时遇到了麻烦:

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 :(得分:1)

如果到达文件末尾,此条件将不会“神奇地”改变。这两个函数都读取到最后,因此,如果要在同一打开的文件上调用它们,则必须显式重置文件指针:

rewind(f);

有关定位文件指针的更多信息,请参见manpage on fseek


更多说明:

  1. 定位文件指针需要一个“可搜索”的文件,例如,如果您的FILE *stdin,则不是这种情况。
  2. 您的代码中存在错误:通过将ch声明为char,可以将int返回的所有fgetc()转换为char。这将导致在检查EOF时出现问题,很可能是您错误地将某些正常字符解释为文件结尾。
  3. int也不是计算尺寸的好选择。我建议至少使用size_tunsigned long long
  4. 注释中已经解决了更多的“小”问题,例如错误地测试了大写字​​符,以及(意外地?)在您的函数之一中使用了全局变量,而不是将FILE *用作参数。