我正在编写一个程序,该程序从作为争论传递的文件中读取,或者如果没有给出争论则从标准输入中读取。 代码在传递文件时运行良好,但在没有传递文件时出现段错误。 如果给出了文件,我基本上会在 argv[1] 上调用 fopen,但如果没有给出文件,我会调用:
f = fopen("stdin", "r");
这是将 stdin 作为文件打开的正确语法吗?
最佳答案
当你启动一个程序时,main()
函数并不是第一个执行的事情。
get 被调用,在 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
的函数,然后
你很可能会遇到段错误。
关于c - 未在命令行上指定输入文件时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60122939/