【问题标题】:Reading from stdin after reading from file从文件读取后从标准输入读取
【发布时间】:2019-06-18 11:28:55
【问题描述】:

从给定文件读取完毕后,或者如果给定文件名不存在,我正在尝试从标准输入读取每一行。目前我正在使用以下格式。

while (fgets(buf, sizeof(buf), fp)!=NULL){
  main process...
}
while (fgets(buf, sizeof(buf), stdin)!=NULL){
  main process...
}

这种格式确实如我所愿。 但是,主进程是一个相当大的代码,有没有办法缩短它,这样我就可以只写一次 while 循环?谢谢。

【问题讨论】:

  • 将while循环和代码放入一个接受FILE *作为参数的函数中?

标签: c


【解决方案1】:

如果您的问题是“主流程”包含很多您不想复制的代码行,那么最直接的解决方案是制作一个实现主流程的函数。

由于 while 循环是相同的,除了文件指针外,您还可以在函数中包含 while 循环,将文件指针作为参数(如 David 所说)。

那么你应该添加一个这样的函数:

void process_input(FILE *input_handle) {
   char buf[1024];
   while (fgets(buf, sizeof(buf), input_handle) != NULL) {
      main process...
   }
}

然后您的原始代码应替换为:

process_input(fp);
process_input(stdin);

【讨论】:

    【解决方案2】:

    有没有办法缩短这个,这样我就可以只写一次while循环?

    没有。

    您当然可以将代码抽象为一个以FILE* 作为参数的函数,或者自己扩展 stdio 接口 (example),但总而言之,它既不是标准 C 也不是任何流行的libc 实现具有类似于perl 中的ARGV 文件句柄的任何东西,或者任何可以让您将文件列表作为单个流打开的东西。

    【讨论】: