2012-02-03 56 views
2

我的文件看起來像:分段故障而讀取文件

123456789 

我的代碼給了我分段錯誤:

#include <stdio.h> 

int main(){ 

    FILE *f; 
    char ch[5]; 
    f = open("a.txt", "r"); 
    fgets(ch, 4, f); 
    ch[4] = NULL; 
    printf("%s", ch); //Fixed 
    return 0; 
} 

我是一個絕對的初學者。我究竟做錯了什麼。我的目標是使用fgets來讀取文件的前4個字符。

+0

'open'返回文件描述符,但不是'FILE *'。使用'fopen'而不是 – starrify 2012-02-03 05:53:32

回答

2

你會想要做

printf("%s", ch); 

對於%格式,參數是指向字符;通過按值傳遞單個字符,您告訴printf將該字符的ASCII值解釋爲指針,這會炸燬你;即如果字符是1,這是ASCII 49,那麼它將在字符串49的內存中尋找一個字符串 - 並向下看,通常是,其中包括

但其次,我看到你打電話open()而不是fopen()。您必須使用fopen(),否則您將無法獲得您所期望的FILE*

這兩個單獨可能會導致段錯誤 - 您需要修復它們兩個。

+0

看起來我必須等5分鐘才能接受答案。不管怎麼說,多謝拉。 – yetanotherstacker 2012-02-03 05:51:27

0

嘗試使用

#include <stdio.h> 

int main(){ 

    FILE *f; 
    char ch[5]; 
    f = fopen("a.txt", "r"); //use fopen 
    fgets(ch, 4, f); 
    ch[4] = NULL; 
    printf("%s", ch); // modification here pass the address of an array to printf 
    return 0; 
} 

試試下面的例子來自審閱網站

/* fgets example */ 
#include <stdio.h> 

int main() 
{ 
    FILE * pFile; 
    char mystring [5]; 

    pFile = fopen ("myfile.txt" , "r"); 
    if (pFile == NULL) perror ("Error opening file"); 
    else { 
    if (fgets (mystring , 5 , pFile) != NULL) 
     puts (mystring); 
    fclose (pFile); 
    } 
    return 0; 
} 

參考http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

你也可以使用

fgetc() :Get character from stream (function)

2

嘗試使用「fopen」而不是「打開」

謝謝。

+0

+1這裏有一個正確的解決方案。 – starrify 2012-02-03 05:56:15

+1

正確的,或者相反的解決方案:使用'int fd'而不是'FILE * f'。 – Eregrith 2012-02-03 09:11:56

+0

嗯,我不知道這個.. – rdo 2012-02-03 09:33:52

2

幾個快速變化。

  1. 我想你想使用fopen而不是在這裏打開,因爲你使用了一個文件指針。
  2. 您需要將讀取的字節數增加到5,最後一個由fgets終止爲null。

    int main() { 
    
        FILE *f; 
        char ch[5]; 
        f = fopen("a.txt", "r"); 
        fgets(ch, 5, f); 
        printf("%s", ch); 
        return 0; 
    
    }