从文件读取后从标准输入读取

时间:2019-06-18 11:28:55

标签: c

从给定文件中读取完或者给定文件名不存在后,我试图从stdin中读取每一行。目前,我正在使用以下格式。

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

这种格式确实可以正常工作。 但是,主进程是一个相当大的代码,是否有一种方法可以缩短代码,以便我只能编写一次while循环?谢谢。

2 个答案:

答案 0 :(得分:3)

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

由于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);

答案 1 :(得分:1)

  

是否有一种方法可以缩短此时间,以便我只能在一次while循环中编写一次?

没有。

您当然可以将代码抽象成一个以FILE*作为参数的函数,或者自己扩展stdio接口(example),但是长短之处在于,这两个标准都不是标准C或任何流行的libc实现都没有像ARGV中的perl文件句柄那样的东西,或者任何可以让您将文件列表作为单个流打开的东西。