2012-10-02 27 views
1

我試圖從文件*中讀取一段文本字符串,但每次嘗試時都會出現段錯誤。這是我在程序中唯一做的事情,所以我不確定爲什麼會發生這種情況。C文件I/O中的段錯誤

#include <stdio.h> 

int main(){ 
    FILE* file; 
    char* string; 
    file = fopen("practice.txt", "r"); 
    fgets(string, 100, file); 
    printf("%s", string); 
    return 0; 
} 
+2

請檢查「'file = fopen()== NULL'」。好? ;)之後,請確保已經爲「fgets()」分配了空間來讀取某些內容。 「'字符串[80]'」和「'fgets(字符串,sizeof(字符串),文件)'」將工作 – paulsm4

回答

6

您還沒有爲您的字符串分配任何內存。您可以使用malloc爲您的字符串分配內存,或使用數組char string[100];

+1

我改變它爲字符串[100],現在它的工作。謝謝您的幫助。 – nh0815

+0

@ nh0815 - 一定要檢查「fopen()」是否失敗。我強烈建議你使用#define和/或「sizeof()」來確保你在fgets(「100」)中允許的#/字節總是匹配緩衝區中的#/字節(「string [100 ]「)。恕我直言... – paulsm4

3

一定要分配內存來存儲你要讀什麼:

char string[101]; 
1

這是因爲string未初始化。 stringchar *並且最初將垃圾值保存爲地址,該地址由fgets函數取消引用,從而導致未定義的行爲。

要麼根本

char string[BUFFER_LEN]; 

並定義BUFFER_LEN適當

或做

char *string; 
string = malloc (sizeof (char) * buf_siz); 

其中buf_siz保持緩衝器的長度。 當您動態分配字符串時,請記住free (string),當您完成使用malloc分配的內存塊時,這是一個很好的做法,並且可以防止較大程序中的內存泄漏。

總是通過檢查返回值fopen來檢查文件是否成功打開。如果它返回NULL那麼打開操作失敗。否則它將返回指針FILE

1

char *string聲明瞭一個指針,但沒有設置它指向任何有意義的地方;您尚未分配任何內存來存儲從文件讀取的文本。

你要麼需要分配一個數組,像這樣:

char string[101] = {0}; 
... 
fread(string,100,file); 
printf("%s\n", string); 

或在運行時分配內存:

char *string; 
... 
string = calloc(101, sizeof *string); 
if (string) 
{ 
    fread(string,100,file) 
    printf("%s\n", string); 
    free(string); 
} 

在這兩種情況下,我們分配足夠的內存爲101個字符佔0結束符,並且由於fread不會在輸入的末尾寫入0終止符,所以我們在兩種情況下(第一次使用初始化程序,第二次調用calloc)將存儲器初始化爲全零。