从给定文件中读取完或者给定文件名不存在后,我试图从stdin中读取每一行。目前,我正在使用以下格式。
while (fgets(buf, sizeof(buf), fp)!=NULL){
main process...
}
while (fgets(buf, sizeof(buf), stdin)!=NULL){
main process...
}
这种格式确实可以正常工作。 但是,主进程是一个相当大的代码,是否有一种方法可以缩短代码,以便我只能编写一次while循环?谢谢。
答案 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
文件句柄那样的东西,或者任何可以让您将文件列表作为单个流打开的东西。