【问题标题】:c count lines in a file avoid EOFc计算文件中的行数避免EOF
【发布时间】:2020-07-04 11:18:43
【问题描述】:

在众多资源中,您可以找到一个简单的 C 程序来计算文件中的行数。我正在使用其中之一。

#include <stdio.h>


int main(int argc, char* argv[]) {   
    FILE *file;
    long count_lines = 0;
    char chr;
 
    file = fopen(argv[1], "r");
    while ((chr = fgetc(file)) != EOF)
    {
        count_lines += chr == '\n';
    }
    fclose(file); //close file.
    printf("%ld %s\n", count_lines, argv[1]);
    return 0;
}

但是,它无法计算 num。 Top2Billion-probable-v2.txt 中的行数。它停在这条线上

<F0><EE><E7><E0><EB><E8><FF>

和输出

1367044 Top2Billion-probable-v2.txt

何时应该输出1973218846 行。 wc -l 以某种方式避免了这个问题(而且速度惊人地快)。

我应该放弃计算文件行数的正确 C 实现,还是应该像 wc 那样间隔特殊字符?

【问题讨论】:

  • chr 必须是 int,而不是 char。见c-faq.com/stdio/getcharc.html
  • fgetc 不返回char,而是返回int。你如何区分0xFF&lt;EOF&gt;char
  • 还可以尝试使用"rb" 而不是仅使用"r" 打开文件。 wc 可能更快,因为它读取更大的数据块而不是单个字符,并使用优化的函数(例如 strchr)搜索这些数据。
  • 你是对的。我应该使用解决问题的int
  • 阅读rb 并没有带来任何加速,顺便说一句。

标签: c eof wc


【解决方案1】:

fgetc() 将读取的字符返回为无符号字符转换为 int 或 EOF。因此,将 chr 声明为 int 而不是 char 应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多