fopen()和命令行参数

时间:2013-05-18 02:20:31

标签: c

我正在尝试编写一个程序来读取文本文件中的第一个字符。如果我使用./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

3 个答案:

答案 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}}。这是非常好的方法,值得考虑。