2013-09-30 117 views
-2

我有一個C代碼讀取TXT文件:要讀取文件的內容用C

#include <stdio.h> 

int main() 
{  
    FILE *pf; 
    int ii; 
    int jj; 

    char *filename; 
    printf("enter file name"); 
    scanf("%s",filename);   

    printf("%s",filename); 

    pf = fopen("filename+.txt", "r"); 
    if(pf==Null) 
    { 
     printf("cant open"); 
    } 
    else 
    { 
     fscanf(pf,"%d,%d" ,&ii,&jj); 
     printf("%d,%d\n" ,ii,jj); 
    } 
    fclose(pf);  

    return 0; 
} 

我仍然得到分割錯誤。 TXT文件輸入包含

2,3

我得到分段錯誤(核心轉儲)當我運行該程序的./readfile輸入。
這裏怎麼回事,我該如何糾正?

+0

你已經完全錯誤的主要方法簽名 – rpeshkov

+0

在fopen中,第一個參數應該是文件名,沒有「和其他調整你鍵入。因此,你會期望一個分段錯誤 – gnometorule

+0

而現在,你的最後一段不介紹你如何使用這個程序:不是,只需鍵入./readfile如果以該名稱(不CMD線PARAM)編譯它 – gnometorule

回答

2

這裏有很多錯誤。

致電fopen()後,您應該檢查pf是否爲NULL,因爲fopen()可能會失敗。

您正在試圖打開名稱filename+.txt的文件。你不應該打開名稱作爲參數提供的文件嗎?

另外,main()的結構應該是int main(int argc, char **argv),你不能做任何你想做的事情。

檢查argc > 1,在這種情況下程序是以參數啓動的,文件名應該在argv[1]中提供。

更新的評論:這是你的代碼看起來應該像:

int main() 
{ 
    char filename[512]; // reserve 512 bytes to receive the file name from input 
    FILE *pf; 
    int ii; 
    int jj; 

    printf("Enter file name: "); 
    scanf("%s", filename); 

    pf = fopen(filename, "r"); 

    if (pf) 
    { 
     fscanf(pf,"%d,%d", &ii, &jj); 
     printf("%d,%d\n", ii, jj); 
     fclose(pf); 
    } 
    else 
    { 
     printf("Failed to open file name %s", filename); 
    } 

    return 0; 
} 

你也可以做到這一點,以獲得從參數文件名:

int main(int argc, char **argv) 
{ 
    FILE *pf; 
    int ii; 
    int jj; 

    if (argc > 1) 
    { 
     pf = fopen(argv[1], "r"); 
     if (pf) 
     { 
      fscanf(pf, "%d,%d", &ii, &jj); 
      printf("%d,%d\n", ii, jj); 
      fclose(pf); 
     } 
     else 
     { 
      printf("Failed to open file name %s", argv[1]); 
     } 
    } 
    else 
    { 
     printf("Insuficient parameters"); 
    } 

    return 0; 
} 

甚至,如果你不不想通過文件擴展名:

int main(int argc, char **argv) 
{ 
    char *filename; 
    FILE *pf; 
    int ii; 
    int jj; 

    if (argc > 1) 
    { 
     filename = malloc(strlen(argv[1]) + 5); // alloc necessary memory 
     strcpy(filename, argv[1]); 
     strcat(filename, ".txt"); 

     pf = fopen(filename, "r"); 
     if (pf) 
     { 
      fscanf(pf, "%d,%d", &ii, &jj); 
      printf("%d,%d\n", ii, jj); 
      fclose(pf); 
     } 
     else 
     { 
      printf("Failed to open file name %s", filename); 
     } 
    } 
    else 
    { 
     printf("Insuficient parameters"); 
    } 

    return 0; 
} 
+0

我試圖改變代碼above.But我仍然得到分割錯誤 –

+0

是啊,我看你改變了你的代碼,但現在你正試圖讀取文件名的未初始化的指針。你必須使用'的malloc() '來分配存儲器空間來接收的文件名的用戶將要輸入。而你的'的fopen()'仍然試圖打開該文件有這個名字實際上是''文件名+ .txt「'。我想你也必須改變這一點。 – Havenard

2

int main(char *)對於不是合法簽名在C.只有

int main(void) 

int main(int argc, char **argv) 

是合法的。在你的情況下,你將需要後者。

+0

我已編輯的代碼,但似乎仍然給出了同樣的錯誤 –

2

這不是爲程序指定參數的正確方法。 即你不能做到這

int main(char *filename) 

應該一直當你編譯程序編譯器錯誤。正確的定義是:

int main(int argc, char **argv) 

哪裏argv是一個字符串數組。嘗試做這個實驗:

int main(int argc, char **argv) 
{ 
    int i; 
    for(i = 0; i < argc; i++) { 
     printf("arg %d is: \"%s\"\n", argv[i]); 
    } 
    return 0; 
} 

然後,編寫程序以使用正確的參數列表,如上所述。其他

有一點要提出的是,你應該測試的fopen返回值。如果是NULL,那麼你不應該試圖訪問該文件(因爲它無法打開)。

+0

我試圖改變代碼:以上 –

+0

,但我仍然得到分割錯誤 –

+0

您正在使用的未初始化的指針'filename',然後試圖讀入它。指針需要指向實際的內存。如果你想讓內存保存字符,declare是'char'數組或者用'malloc'動態分配的。這個答案的重點是幫助你從命令行獲得價值,而不是嘗試完全不同的東西。 – paddy