2012-11-28 35 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; 
}