我正在尝试将名为data1的数据文件重定向到我的程序中,但我继续获得segmentation fault
。
当我尝试./w data1
时,它会正确读取它,但当我./w < data1
时,会弹出错误。
我必须使用第二种方式进行分配。
以下是我的代码:
int main(int argc, char *argv[])
{
FILE *Q;
Q = fopen(argv[1],"r");
}
答案 0 :(得分:3)
argv[1]
指向二进制文件的第一个参数(没有它的名字),因此在./w < data1
的情况下它会丢失。您正试图访问“非法”内存,因此您会遇到段错误。
标记<
是一个bash功能,它不会传递给C.
如果要使用这样的重定向,只需从标准输入读取而不关心文件/ argv。这意味着“获取文件data1并将其传递给描述符0,即标准输入”。
您可以使用scanf
或read(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
}