我创建了一个程序来模仿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/

10-11 15:31