【问题标题】:Why doesn't my linecount in C work?为什么我在 C 中的行数不起作用?
【发布时间】:2012-11-08 14:59:21
【问题描述】:

我正在尝试读取一个文本文件,但在此之前我想知道我要读取多少个元素。所以我需要计算文本文件的行数。到目前为止,我有这个:

int getLinecount (char *file) 
{
    int ch, count = 0;
    FILE *fp = fopen(file, "r");
    if(fp == NULL)
    {
        return -1;
    }
    while((ch = fgetc(fp)) != EOF)
    {
        if (ch == '\n'); 
        {
            count++;
        }
    }
    fclose(fp);
    return count;
}

这工作得很好。我没有对文本文件进行任何更改,尽管该文件只有 10,000 行,但它仍然打印 130,000。 我在正文中唯一写的是:

linecount = getLinecount("...");

我真的很好奇错误在哪里。另外,是否有更好的选择来获取行数?

【问题讨论】:

  • 使用调试器跟踪它会立即将您指向这个;
  • 了解您的编译器并在编译时打开完整的警告。例如 gcc 的 -Wextra 选项会捕获并输出:warning: empty body in an if-statement

标签: c line-count


【解决方案1】:

if 语句后面有一个分号 ;。然后,块总是被执行:

{
    count++;
}

【讨论】:

  • 我怎么能忽略它以及它是如何到达那里的?非常感谢!
【解决方案2】:

改变

if (ch == '\n'); 

到:

if (ch == '\n')

【讨论】:

    【解决方案3】:

    if 后面的分号:将其删除。带有尾随分号的代码相当于:

    if (ch == '\n') {}
    count++;
    

    意味着count 会随着循环的每次迭代而递增(文件中的每个char)。

    【讨论】:

      【解决方案4】:

      if 后面的分号要删除

      对于读取文件,最好使用此代码 :

      while((fgets(blahblahblah)) != NULL) {
        counter++;
      }
      

      【讨论】:

        【解决方案5】:

        除了分号 (;) 之外,一切都很好,应该从行中删除它

        if (ch == '\n')
        

        【讨论】:

          【解决方案6】:

          除了其他人提到的; 问题之外,可以在this 帖子中找到替代解决方案,因为他解释了为什么他会这样做。

          【讨论】:

            【解决方案7】:

            您可能需要考虑用于创建和查看此文件的操作系统。

            复制自PHP Echo Line Breaks:

            • '\n' 是 linux/unix 换行符
            • '\r'是经典的mac换行符【OS X使用上面的unix\n】
            • '\r'+'\n' 是windows换行符

            【讨论】:

            • 他以文本模式打开文件,所以无论平台如何,换行符都是'\n'
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-10-15
            • 1970-01-01
            • 1970-01-01
            • 2022-09-23
            • 2021-12-18
            • 2017-06-12
            • 1970-01-01
            相关资源
            最近更新 更多