3

我是 CI 中文件处理的新手,我正在开发一个计算 c 中的行数和字符数的程序。该程序对字符运行良好,但对于行,o/p 总是少一个。我使用了换行符数着数 行数。这是我的代码:

 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);
}

我的实现有什么问题?。还有其他方法可以计算编号吗?行数?

4

4 回答 4

8

这取决于您对线的定义。如果一个文件只包含单个字符'a',它是一行还是没有行?根据您的程序逻辑,它有零行。

您可以在while循环结束时在 close 之外添加}以下行:

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

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

正如您从其他答案中看到的那样,计算文件中的行数意味着什么并不完全清楚。在开始编写代码之前,请确保您对要计算的确切内容有非常清楚的了解。

于 2012-12-29T08:14:44.173 回答
3

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

于 2012-12-29T08:14:54.187 回答
3

[已编辑]

最终结果将减少 1,因为您将 "\n" 计为行尾,而最后一行不会将 "\n" 作为行尾。它只会找不到字符。(感谢您指出我的错误@Basile)

因此,对于正确的答案,只需增加 while 循环之外的行数。

@DavidSchwartz 发现这个答案不充分并指出了显而易见的问题。因此,为了完整起见,我将添加:(在David Schwartz 的解决方案中继续)。

于 2012-12-29T08:15:01.547 回答
1

最后一行不计入您的程序,因为它没有遇到\n..

编写也计算最后一行的逻辑..

于 2012-12-29T08:35:20.323 回答