c - 我怎样才能纠正这个代码,以便它给出预期的结果

标签 c linux

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

相关文章:

c - 用这些策略初始化这个结构有什么区别?

linux - 使用shell脚本修改字体大小

c - 简单的输入。程序崩溃

c - C语言中如何对齐列

c - 结构、typedef 和 malloc、calloc

c - 使用 bsearch() 搜索 char 数组时有没有找到元素位置的方法

linux - 如果文件中存在,awk 管道的尾部不追加

linux - Docker 历史基础镜像添加 :sha256hash

C++ NCurses 如何获取当前光标位置?

c++ - 固定到核心的 FIFO 线程上的 std::promise::set_value 不会唤醒 std::future