在C编程中输入重定向?

时间:2013-10-21 20:54:33

标签: c

我正在尝试将名为data1的数据文件重定向到我的程序中,但我继续获得segmentation fault

当我尝试./w data1时,它会正确读取它,但当我./w < data1时,会弹出错误。

我必须使用第二种方式进行分配。

以下是我的代码:

int main(int argc, char *argv[])
{
 FILE *Q;
 Q = fopen(argv[1],"r");
}

7 个答案:

答案 0 :(得分:3)

argv[1]指向二进制文件的第一个参数(没有它的名字),因此在./w < data1的情况下它会丢失。您正试图访问“非法”内存,因此您会遇到段错误。

标记<是一个bash功能,它不会传递给C.

如果要使用这样的重定向,只需从标准输入读取而不关心文件/ argv。这意味着“获取文件data1并将其传递给描述符0,即标准输入”。

您可以使用scanfread(0, ...)来使用该文件的内容。

答案 1 :(得分:2)

使用./w < data1时,您无需打开文件。请阅读stdin

答案 2 :(得分:2)

你的第一个命令工作的原因是你为程序提供了一个参数(在你的情况下,文件名),你的程序使用该参数打开文件。

当您使用重定向时,您将stdin和stdout(使用gets和printf等函数访问)重定向到文件,因此您根本不必打开程序中的任何文件。

答案 3 :(得分:0)

您发出的第二个命令会将文件的内容重定向到程序的标准输入。这意味着两件事,首先你需要从stdin(scanf)读取数据,并且argv [1]将是未定义的。

所以要回答你的问题,你试图打开一个未定义的值,转换为指针,这反过来会导致你的崩溃

答案 4 :(得分:0)

当程序以重定向开始时,文件已经打开。您可以从名为“stdin”的流中读取它。在这种情况下,你正在使用指向不存在的东西(argv [1])的指针,这就是它失败的原因。

许多C函数默认使用stdin,因此您不必指定要读取的文件。

答案 5 :(得分:0)

您应该像这样初始化FILE*变量:

FILE *Q; 
if (argc >= 2) {
    // at least one argument given, try to open it as file
    Q = fopen(argv[1],"r");
    // let's add error checking while we're at it!
    if (!Q) {
        perror("fopen");
        return 1; // note: this only works if this code is in main function
    }
} else {
    Q = stdin;
}

现在Q是作为命令行参数给出的文件,或者是stdin,意思是标准输入。

答案 6 :(得分:0)

有时你想提供没有参数,并且使用stdin,有时你想打开一个文件。这是你想要做的,

int main(int argc, char *argv[])
{
    FILE *Q = stdin; //use stdin unless you provide a filename
    if( (argc>1 ) && strcmp(argv[1],"-") ) { //allow "-" as alias for stdin
        if( !(Q = fopen(argv[1],"r")) ) {
            printf("Error, cannot open %s\n",argv[1]);
            exit(1);
        }
    }
    //read from Q here
}