2012-11-28 100 views
1

我在文件重定向到我的程序时遇到问题。我有一个名为test的Makefile,我想将文本文件重定向为输入。例如,我想做的事:文件重定向到程序

测试< file.txt的

输入到我的可执行文件。但是,当我尝试读取file.txt的内容时,我不断收到分段错误。这是我的尝试:

int main(int argc, char* argv[]) 
{ 
    FILE *a; 
    int count; 
    a = fopen(argv[1], "r"); 
    for(n = 0; ; n++) 
    { 
    count = fgetc(a); // <- here is where my program segfaults 
    if(feof(a)) 
     break; 
    } 
    return 0; 
} 

可能有人知道为什么会发生这种情况?

+1

谢谢谢谢你谢谢你正确地做'eof'! –

回答

1

这是因为重定向由shell处理并且不作为参数传递。使用重定向时,该文件用于stdin

您应该经常检查函数的结果,在这种情况下,您尝试调用fopenNULL作为文件名,因此它将返回NULL导致您的段错误。

+0

'fgetc'未定义为'NULL'作为其参数(当然是非流参数的“专业化”),那么?这似乎是来自文档的暗示,尽管由于某种原因,我很惊讶。 –

+0

@LightnessRacesinOrbit我没有C标准,但没有任何引用可以访问(包括POSIX标准,它应该是实际的C标准的副本),它提到了使用'NULL'作为文件指针的所有内容,所以我会说这绝对是未定义的行为。推测某些实现的行为可能是一个正确的指针,并且无需任何检查就可以访问它。 –

+0

只是想弄清楚为什么我很惊讶。我希望有一个“安全”的结果,可能是因为POSIX函数对错误进行保留的倾向,包括'fgetc',它被定义为在错误时返回'EOF'(我并不是声称这应该包括bad-输入案例;这只是有趣的) –

0

shell不会将“<”和“file.txt”作为参数传递给程序,因此您的argv[1]正在返回随机垃圾。

而不是从a读取,您应该从stdin读取,它是自动可用并打开。

int main(int argc, char* argv[]) 
{ 
    int count; 
    for(n = 0; ; n++) 
    { 
    count = fgetc(stdin); 
    if(feof(stdin)) 
     break; 
    } 
    return 0; 
}