2011-03-06 136 views
0

我是C新手,沒有分段故障,我無法完全掌握它。如何在C語言中使用stdio.h讀取文件單詞?

這裏是我的想法至今:

#include<stdio.h> 
#include<string.h> 

char *nextWord(FILE *stream) { 
    char *word; 
    char c; 

    while ((c = (char)fgetc(stream)) != ' ' && c != '\n' && c != '\0') { 
     strcat(word, &c); 
    } 

    return word; 
} 

int main() { 
    FILE *f; 
    f = fopen("testppm.ppm", "r"); 
    char *word; 
    word = nextWord(f); 
    printf("%s",word); 
} 
+0

strcat不是你想要的。在你遵循克里斯的建議並且將單詞指向一個實際的緩衝區之後,你應該做一些像[i ++] = c的事情; (或者,通常* word ++ = c並且有另一個指針保持跟蹤緩衝區的開始) – 2011-03-06 20:48:37

回答

1

在你nextWord功能,你永遠不初始化局部變量word在什麼點,所以當你試圖寫入所指向的內存strcat,你獲得段錯誤。

您需要分配內存來存儲要讀取的單詞。問題是,你不知道這個詞有多大,所以你不知道分配多少空間。有許多可能的方法:

  • 使用(大)固定大小的緩衝區堆棧上舉行的話,你讀它,然後將其複製到適當大小的malloc分配區域,當你把它返還。如果遇到對於固定大小的緩衝區來說太大的單詞,會出現問題。

  • 分配一個小塊來讀取單詞,並跟蹤讀取字符時使用了多少。塊填滿後,重新分配它變大。

-1

或者你也可以在你的while循環中使用fscanf函數。

char *nextWord(FILE *stream) { 
    char *buffer[124], *word; 
    int previous_size = 0; 

    while(!feof(!stream)){ 
     int n = fscanf(file, "%s", buffer); 
     if(word == NULL){ 
      word = malloc(sizeof(char)*n) 
     } else { 
      realloc(word, n + previous_size); 
     } 
     strncat(word, buffer, strlen(buffer) - 1);   
     previous_size = n; 
     } 
     return word; 

} 

有點解釋。函數fscanf返回讀取的字符數。所以我做的第一件事就是保存這個價值。如果單詞爲NULL,則爲其分配字符數量,否則用previous_size變量分配單詞。 不要忘記沖洗緩衝區變量

+0

不要使用fscanf來將長度未知的字符串讀入固定大小的緩衝區。你想使用一個函數來指定緩衝區的大小。 – dreamlax 2011-03-06 21:29:08

+0

-1:由於fscanf返回匹配的項目數(在本例中通常總是1),而不是讀取的任何東西的長度,所以這幾乎總是會崩潰。另外,如果該單詞對於緩衝區來說太長,則會發生不好的事情。 – 2011-03-06 22:55:51

相關問題