我正在尝试编写一个程序来读取文本文件中的第一个字符。如果我使用./a.out myfile.txt
,则按预期工作,但如果我使用./a.out <myfile.txt
,则会获得Segmentation fault: 11
。我试图包含<
的原因是因为这就是赋值规范中的内容。下面的代码只是我所做的一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int func(int argc, char **argv){
FILE *fp;
int test = 0;
fp = fopen(argv[1], "r");
fscanf(fp, "%i", &test);
printf( "current file: %s \n", argv[1]);
}
int main(int argc, char **argv){
func(argc, argv);
}
我有什么方法可以接受这个论点<myfile.txt
?
答案 0 :(得分:6)
不,你也不应该尝试。以这种方式重定向的文件将显示在stdin
,您应该使用它(提示:检查argc
)。
答案 1 :(得分:5)
如果要使用文件(如果已指定),否则使用stdin,请使用以下内容:
if (argc > 1)
fp = fopen(argv[1], "r");
else
fp = stdin;
答案 2 :(得分:1)
在您的命令./a.out <myfile
中,您将stdin重定向到myfile
。这意味着从stdin读取实际上是从myfile
读取。因此,在这种情况下,您使用的argc == 1
argv[1]
NULL
main
fopen
(参见NULL
规范)。使用stdin
名称时cat myfile | ./a.out
崩溃。
您可以通过其他方式执行实用程序:始终阅读{{1}}。当您需要输入文件时,请执行以下操作:{{1}}。这是非常好的方法,值得考虑。