使用C语言计算文件中的行数

3

我是一个初学者,正在学习C语言文件处理。我正在编写一个程序来计算C语言中的行数和字符数。该程序对于字符的计数工作正常,但是对于行数的计数始终比实际少一个。我已经使用换行符来计算行数。以下是我的代码:

 main()
{
    FILE *fp;
    int c,nl=0,nc=0;
    char str[20];
    printf("Enter filename\n");
    scanf("%s",str);
    fp=fopen(str,"r");
    if(fp==NULL)
    {
        while(1)
        {
        printf("File does not exist\n");
        printf("Enter new filename\n");
        scanf("%s",str);
        fp=fopen(str,"r");
        if(fp!=NULL)
        break;
        }
    }
    c=getc(fp);
    while(c!=EOF)
    {
        if(c=='\n')
        nl++;
        nc++;
        c=getc(fp);
    }
    printf("no of lines=%d no of char=%d",nl,nc);
}

我的实现有什么问题?是否有其他方法来计算行数?

2
非常微小(基于个人意见)的风格细节:while(1) 可以改为 while(!fp)。你甚至可以使用 do-while 循环来避免重复 fopen 行。do { scanf(...); fp = fopen(...); } while (!fp); - Corbin
请养成编译时开启所有警告和调试信息的习惯,例如在Linux上使用gcc -Wall -g。至少,您的main函数定义不当(它应该返回一个int)。 - Basile Starynkevitch
4个回答

8

这取决于你对“行”的定义。如果一个文件仅包含单个字符“a”,它是有一行还是没有行?按照你的程序逻辑,它没有行。

你可以在while循环结束后,在闭合的代码}之外添加如下代码:

if (c != '\n') nl++;

如果最后一个字符不是换行符,这将添加一行额外的内容。同时,你还应该将c初始化为零,否则如果文件为空,这将导致不可预测的结果。

从其他答案中可以看出,计算文件中行数的含义并不完全清楚。在开始编写代码之前,请确保你非常清楚地理解了你要计数的内容。


检查空文件和以换行符结尾的文件。确保正确处理所有这些情况。 - David Schwartz
  1. 如果在 while 循环后 c 始终为 EOF,那么 if (c != '\n') nl++; 似乎没有帮助?
  2. 不要认为 c = 0; 有帮助,因为第一次使用 cc=getc(fp);
- chux - Reinstate Monica

3
任何文件的最后一行不需要以换行符\n结尾。因此,你的程序将报告换行符的数量,而不是“行”的数量(这是一个传统上定义的概念)。

3

[编辑]

最终的结果会减少1,因为你把"\n"作为行末,而最后一行并没有"\n"。它只是找不到字符。(感谢@Basile指出我的错误)

所以正确答案就是在while循环之外增加行数。

@DavidSchwartz认为这个答案不充分,指出了显而易见的问题。 所以为了完整起见,我会添加:(继续查看David Schwartz的解决方案)。


2
最后一行不包含 EOF,它只是在读取失败时由 getc 返回的结果,因为已经到达了文件结尾。换句话说,EOF 不是一个可能的字符! - Basile Starynkevitch
@DavidSchwartz 技术上是的。一个空行。(根据OP对于一行的定义。) - varevarao
按照楼主的定义,这是一条线。我完全同意你的看法。 - varevarao
OP并没有真正说明他的定义。他说他的代码产生的数字总是少一个,暗示他可以只加一。但我强烈怀疑他没有测试任何边缘情况,其中他的程序产生了一个不比“正确”结果少一个的结果。解决这个问题的难点在于定义以足够精度计算文件中的行数意味着什么。 - David Schwartz
@varevarao:这就是他尝试过的,但他发现它不起作用。 - David Schwartz
显示剩余3条评论

1

你的程序中最后一行没有被计算,因为它没有遇到\n

编写逻辑以使其也计算最后一行。


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