2014-02-06 86 views
2

我對C非常陌生,我試圖按字符讀取一個文件的內容並將它們輸出到流中。但即使使用我的fopen()命令註釋掉了我也會收到segfault(核心轉儲)。我爲什麼要進行分割?

我必須運行一個命令:./a.out < testWords.in> myOut.txt正確執行我的文件。

這是我到目前爲止有:

#include <stdio.h> 
void main(char *fileName[]) 
{ 
    printf("filename is %s.\n",fileName[0]); 
    //Get file based on a string inputed 
    FILE *fp=fopen(fileName[0],"r"); //Fetches our file as read only 
    char ch; 
    int lineCount = 0; 
    int wordCount = 0; 
    int charCount = 0; 

    //Failed to find/open file. NULL character. 
    if (fp == 0) printf("Woops! Couldn't open file!\n"); 

    //While not at end of file, grab next char. 
    else while((ch=fgetc(fp)) != EOF) 
    { 
     if (ch == '\n') //on newline 
     { 
    //Prints (charCount,wordCount)\n lineCount: 
    printf("(%d,%d)%c%d:",charCount,wordCount,ch,lineCount); 
    charCount = 0; 
    lineCount += 1; 
     } 
     else printf("%c",ch); //mirrors char. 
    } 
    fclose(fp); //Closes file (gotta be tidy!) 

} 
+0

因爲您正在調用未定義的行爲。看看你的main()參數。你似乎錯過了一件非常重要的事情。 – WhozCraig

回答

2

你不能只是發明一種方式來撥打main。您需要使用的標準方法之一,這樣的:

int main(int argc, char *argv[]) 
{ 
    if (argc < 2) { 
     fprintf(stderr, "Missing filename\n"); 
     return -1; 
    } 
    FILE *fp = fopen(argv[1], "r"); 
    // ... 
} 

並注意argv[0]包含程序名稱(如果可用;如果沒有它包含一個空字符串)。

由於您收到參數到您的char *filename[]參數中,您的程序已被隔離。如果使用單個命令行參數運行程序,則作爲第一個參數傳入的值將爲2,這不是有效的指針值。表達式filename[0]取消引用該地址並導致段錯誤。

+0

這擺脫了我的segfault,但用我的命令:「./a.out myOut.txt」我收到Missing Filename的錯誤。爲什麼? – user1695505

+1

因爲你還沒有提供任何命令行參數。相反,你已經重定向了stdin和stdout。如果這就是你想要的,那麼就去掉所有的'FILE'東西,然後從標準輸入讀取並寫入標準輸出(例如'fgets'或'scanf',和'printf')。 – ooga

0

任何時候你用C得到段錯誤,你應該氣味在參數列表錯誤的指針或地址。在這種特殊情況下,主要簽名是總是int main(int argc, char** argv)。你的不是。

你想要的是

int main(int argc, char ** argv) { 
    ... 
    FILE * fp = fopen(argv[1]); // Quiz: why argv[1]? What's argv[0]? 

你就要用它的編譯器,因爲基本上,運氣。

我也注意到在你的示例調用中,實際上沒有參數在參數列表中,因爲您使用重定向。

0

用途:

int main(int argc, char* argv[]) 

而且使用的argv [1]爲文件名。

主要功能必須始終接收這兩個參數。