我创建了一个程序来模仿Linux中的“cat”命令。
我想制作一个程序来满足“cat”的“-n”选项的要求,该选项显示行号以及文件内容。
到目前为止,这是我所做的。
int numline = 1;
int i = 2;
printf("\t%d ", numline);
for(i; i < argc ; i++)
{
fptr = fopen(argv[i], "r");
if(fptr == NULL)
{
printf("Can not open file");
return -1;
}
c = fgetc(fptr);
while(c != EOF)
{
if(c == '\n')
{
numline++;
printf("\n\t%d ", numline);
}
else
printf("%c", c);
c = fgetc(fptr);
}
fclose(fptr);
}
这是示例输出。
1 hi how are you
2
3
4 i am fine
5
6 thank you
7
8 bye
9 cya
10 garbage text
11
12
13 bye
14
问题出在第14行。文件在第13行结束,但是程序仍然打印第14行。我该如何纠正?
谢谢。
最佳答案
阅读时,'\n'
指示文本文件中的行尾,而不是新文件的开头,即使C称其为新行。
而不是测试if (c == '\n')
以确定新行,而是检查前一个c是否是'\n'
。
确保使用int c
。
// Commented out, not needed
// printf("\t%d ", numline);
int c;
int previous_c = '\n';
while((c = fgetc(fptr)) != EOF) {
if (previous_c == '\n') {
numline++;
printf("%d ", ++numline);
}
printf("%c", c);
previous_c = c;
}
由于输入的最后一个字符可能与
'\n'
不同,因此代码可以在循环后检测到该字符并添加一个。if (previous_c != '\n') {
printf("\n");
}
关于c - 我该如何纠正此代码,以便得到预期的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52164304/