使用C语言计算行数

3
有没有一种使用C语言计算文件行数的方法?

编辑注:这个编辑是根据原帖糟糕的英语猜测得出的;另一个可能的解释是:“如何计算C源文件中代码行数”。我认为这个编辑反映了问题的主体,而另一个版本则反映了问题的标题。 - Yi Jiang
5个回答

4

如果您想以编程方式执行此操作,请在文本模式下打开文件,并执行fgetc()操作,直到达到文件结尾。保持调用fgetc的次数计数。

    FILE *fp = fopen("myfile.txt");
    int ch;
    int count=0;
    do
    {
        ch = fgetc(fp);
        if(ch == '\n') count++;   
    } while( ch != EOF );    

    printf("Total number of lines %d\n",count);

2
如果文件包含超过10000个字符的行,那么这将给出错误的答案。最好使用getc逐个读取字符,并计算换行符。 - Thomas Padron-McCarthy
+1 @Thomas 是正确的。最好读取一块大小为1024字节的数据并循环处理缓冲区。 - salezica
新版本使用fgetc而不是fgets更好,但仍然不完全正确:ch应该是int类型,而不是char类型。 - Thomas Padron-McCarthy
@Santiago:分块读取会使代码变得复杂,但是我们可能不应该期望速度有很大的提升。stdio库会自动缓冲,因此低级别的读取无论如何都会以块的方式进行。 - Thomas Padron-McCarthy
@Thomas:除非文件包含ASCII值大于127的数据,否则char类型将满足要求。当然,fgetc返回的是int类型而不是char类型,这是正确的。 - Shamim Hafiz - MSFT
@Gunner - char 可能是无符号的,EOF 可能是 -256。 - aaz

3
如果你是在指向你的C源代码中的行号,大多数编译器都支持__LINE__宏。
如果你想要计算任意文本文件中的行数,以下功能应该成为起点:
- fopen() 打开一个文件以进行读取 - fgets() 读取行 - eof() 检查文件结束 - fclose() 关闭文件
将它们组合成一行计数器留给读者作为练习 :)

2
尝试使用wc命令。大多数Linux发行版都包含它。

0

一个经常困扰的问题是,无论你使用哪种方法,文件是否包含符合 POSIX 标准的 '\n' 在最后一行都会影响返回的行数。有许多编辑器(和程序)可以愉快地将最终文本写入文件而不添加 POSIX 行尾标识符。无论你使用哪种方法确定文件中的行数,都可以处理这两种情况。

如果你想确定一个文件的行数,那么你肯定需要使用缓冲读取(例如每次读取多个字符到缓冲区)而不是逐个字符读取。这可以极大地提高效率。

将这两个部分结合起来,你可以使用 fgets 或 POSIX 的 getline 相当有效地确定文件中的行数。例如,使用 getline(它处理了行尾问题),你可以这样做:

/** open and read each line in 'fn' returning the number of lines */
size_t nlinesgl (char *fn)
{
    if (!fn) return 0;

    size_t lines = 0, n = 0;
    char *buf = NULL;
    FILE *fp = fopen (fn, "r");

    if (!fp) return 0;

    while (getline (&buf, &n, fp) != -1) lines++;

    fclose (fp);
    free (buf);

    return lines;
}

使用fgets函数,在最后一个换行符之后测试是否还有其他文本,这取决于你的代码,例如:

/** note; when reading with fgets, you must allow multiple reads until
 *  '\n' is encountered, but you must protect against a non-POSIX line
 *  end with no '\n' or your count will be short by 1-line. the 'noeol'
 *  flag accounts for text without a '\n' as the last line in the file.
 */
size_t nlines (char *fn)
{
    if (!fn) return 0;

    size_t n = 0, noeol = 0;
    char buf[FILENAME_MAX] = "";
    FILE *fp = fopen (fn, "r");

    if (!fp) return 0;

    while (fgets (buf, FILENAME_MAX, fp)) {
        noeol = 0;
        if (!strchr (buf, '\n')) {
            noeol = 1;  /* noeol flag for last line */
            continue;
        }
        n++;
    }
    if (noeol) n++;     /* check if noeol, add 1 */

    fclose (fp);

    return n;
}

(注意:您可以在每个函数中添加自己的代码来处理fopen失败。)


0
请思考一下在文件中计算行数需要做什么:
  1. 打开文件进行读取,可以使用fopen()函数;

  2. 逐行读取文件内容,可以使用fread()函数;

  3. 增加一个之前初始化为零的行计数器;

  4. 当从文件的下一次读取返回文件结束时,您就完成了。使用printf()函数输出行计数器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接