我刚接触CI中的文件处理正在开发一个程序,用于计算c中的行数和字符数。该程序对于字符工作正常但是对于行,o / p总是少一个。我使用了新的用于计算编号的行字符。 of lines.Here是我的代码:
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);
}
我的实施有什么问题?。还有其他方法来计算no。线?
答案 0 :(得分:8)
这取决于你对一条线的定义。如果文件只包含单个字符'a',它是否有一行或没有行?按照程序的逻辑,它有零行。
您可以在while
循环结束时在结束}
之外添加此行:
if (c != '\n') nl++;
如果最后一个字符不是换行符,则会添加一行。您还应该将c
初始化为零,否则如果文件为空,这将导致不可预测的结果。
从其他答案中可以看出,计算文件中的行数意味着什么并不完全清楚。在开始编写代码之前,请确保您非常清楚地了解您正在尝试计算的内容。
答案 1 :(得分:3)
任何文件的最后一行都不需要以换行符\n
结尾。因此,您的程序将报告换行符的数量,而不是“行”的数量(这是一个传统定义的概念)。
答案 2 :(得分:3)
<强> [编辑] 强>
最终结果将减少1,因为您将“\ n”计为行尾,而最后一行不会将“\ n”作为行尾。它只会找不到任何角色。 (感谢你指出我的错误@Basile)
因此,对于正确的答案,只需增加while循环外的行数。
@DavidSchwartz认为这个答案不够充分,并指出了明显的答案。因此,为了完整性,我只需添加:(继续solution by David Schwartz)。
答案 3 :(得分:1)
最后一行未计入您的计划,因为它没有遇到\n
..
写出也计算最后一行的逻辑。