使用C计算行数

时间:2011-02-28 07:24:53

标签: c linux

有没有办法用C计算我文件中的行数?

5 个答案:

答案 0 :(得分:3)

如果您在 c源代码中引用行号,则大多数编译器都支持__LINE__宏。 如果要计算 c中任意文本文件的行号,以下函数应该是起点:

  • fopen()打开文件进行阅读
  • fgets()读取行
  • eof()检查文件结尾
  • fclose()关闭文件

将这些组合成一个行计数器留给读者练习:)

答案 1 :(得分:3)

如果要以编程方式执行此操作,请以文本模式打开文件并执行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 :(得分:2)

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

答案 3 :(得分:0)

请考虑一下您需要做些什么来计算文件中的行:

  1. 打开文件进行阅读,可能使用fopen();

  2. 读取每一行,一次一行,也许用fread();

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

  4. 从下次读取文件返回的文件结尾,您就完成了。 printf()行计数器。

答案 4 :(得分:0)

无论您使用何种方法,可能会影响返回行数的一个唠叨问题是该文件是否在最后一行末尾包含符合POSIX的'\n'。有许多编辑器(和程序)很乐意将最终文本量写入没有POSIX行尾的文件。无论使用哪种方法确定文件中的行数,都可以处理任何一种情况。

如果您正在尝试确定 large 文件中的行数,那么您肯定需要缓冲读取(例如,将多个字符读入缓冲区,每次读取)而不是< em>逐个字符方法。这可以大大提高效率。

将这两个部分放在一起,您可以使用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失败。)