我正在编写一个程序,该程序读取作为争论传递的文件,如果没有给出争论,则从stdin读取。传递文件时,代码运行良好,但是没有传递文件时出现段错误。如果给出了文件,我基本上会在argv [1]上调用fopen,但是如果没有给出文件,我会调用:
f = fopen("stdin", "r");
这是将stdin作为文件打开的正确语法吗?
USE f = stdin;不是f = fopen(“ stdin”,“ r”);
启动程序时,main()
功能不是调用,在main()
函数被执行之前,发生了很多事情叫。这些事情之一是打开stdin
,stdout
和stderr
。在通常,您无需担心操作系统如何执行操作的细节,您只是可以中继当执行main()
时,这些流是打开的,您可以使用它们。
因此,您可以执行此操作:
#include <stdio.h>
int main(int args, char **argv) {
FILE *fp;
if(args == 1) {
fp = stdin;
} else {
fp = fopen(argv[1], "r");
if(fp == NULL) {
fprintf(stderr, "Unable to open %s for writing\n", argv[1]);
return 1;
}
}
// do your read operations on fp
if(fp != stdin) {
fclose(fp);
}
return 0;
}
因此,当您在不带参数的情况下调用程序时,将使用stdin
,否则文件被使用。
代码崩溃的原因是因为
f = fopen("stdin", "r");
尝试打开一个字面上叫stdin
的文件,您很可能不会打开有。 fopen
将返回NULL
,您可能不需要检查。如果你尝试使用需要FILE*
指针但传递NULL
的函数,然后您很可能会遇到段错误。