c - 为什么这次打印的是之前的输出?

标签 c file-io stdin

我正在致力于 cat linux 命令的实现。目前,当命令后没有传递参数时,它可以从标准输入读取,并按顺序从多个文件中读取,但是当“-”作为参数传递时,在某些情况下会在从标准输入读取之前打印先前的输出。

例如,如果您传递 - file1.txt - file2.txt - 作为参数,则一切都会按预期工作。它从标准输入读取,输出 file1.txt 的内容,再次从 stdin 读取,依此类推。但是,如果我删除第一个“-”,换句话说,如果第一个参数是一个文件,那么它会输出 file1.txt 的内容,然后从 stdin 读取,然后打印第二个文件的内容,然后,而不是读取像以前一样从 stdin 读取,第一次从 stdin 读取时,它会再次输出第二个文件的内容,然后输入,之后才开始正常运行。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 1024

void readStdin(){
  char buffer[BUF_SIZE];
  while(fgets(buffer, BUF_SIZE, stdin)){ //reads from the standard input and prints the input
    char *content = malloc(sizeof(char*)*BUF_SIZE);
    if(content == NULL){ //failed to allocate memory
      exit(1);
    }
    strcat(content, buffer);
    //printf("buffer: %s", buffer);
    //printf("content: %s", content);
    printf(content);

    memset(&content[0], 0, sizeof(*content));
    free(content);

    //printf("bufferEND: %s", buffer);
    //printf("contentEND: %s", content);
  }
}

void readArgs(int argc, char* argv[]){
  FILE* fp;
  char ch;
  for (int i=1; i<argc; i++){
    if (*argv[i] == '-'){
      readStdin();
      clearerr(stdin);
    }

    //else if ()
    else {
      fp = fopen(argv[i], "r");
      if (fp==NULL){ //in case the file doesn't exist
        printf("%s: No such file or directory\n", argv[i]);
        exit(1);
      }
      while ((ch=fgetc(fp)) != EOF){
        putchar(ch);
      }
  //    fflush(stdin);

      fclose(fp);
    }
  }
}

int main(int argc, char* argv[]){
  if (argc<2){
    readStdin();
    return 0;
  }
  readArgs(argc, argv);
  return 0;
}

有什么提示吗?

编辑:如果我传递另一个文件,后跟另一个“-”,在以上述错误方式从标准输入读取后,不仅它的行为相同,而且不会打印上一个输出的第一个字符

最佳答案

此处的代码需要“-”作为参数

if (*argv[i] == '-'){
  readStdin();
  clearerr(stdin);
}

您的程序仅在收到“-”作为参数时调用 readStdin(),否则输出参数文件。

当你传递- file1.txt - file2.txt -时,这些是5个参数(6个包括程序名称)告诉你的程序“读取,输出file1.txt,读取,输出file2。 txt,阅读“
因此,当您删除第一个 - 时,您也删除了第一个“read”,而是告诉您的程序“输出 file1.txt,读取,输出 file2.txt,读取”

关于c - 为什么这次打印的是之前的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55554083/

相关文章:

c - 在 C 中将两个 8 位寄存器读入 ADXL362 的 12 位值

c - 如何将浮点值准确写入bin文件

R write(append = TRUE)覆盖文件内容

python - 在向标准输出显示消息时不要打扰用户输入

windows - 是否可以将脚本通过管道传输到 WScript?

c - 如何将我的 swift 类转换为像 objective-c 中的 __bridge 这样的 UnsafePointer

c - pow 函数给出不需要的结果 c

c - 如何使用简单的转义序列对东欧(波兰)符号进行编码?

C++ 文件处理,is_open 返回错误

node.js - Node.js 中的标准输入 block