2012-05-08 59 views
2

所以我一直試圖以各種不同的方式將此分配給工作,但每次我得到不同的錯誤。基本上我們所擁有的是一個程序,需要逐字節讀取將被傳入的文件的內容(文件長度可能很大,所以我們不能只調用malloc並分配一大塊空間)。我們需要使用realloc來擴展釋放的內存量,直到達到文件末尾。最終的結果應該是一個包含每個字節的長C字符串(數組)(如果它們是文件的一部分,我們不能忽略空字節)。我目前所面對的是:從標準輸入(可變長度文件)中讀取

char *buff; 
    int n = 0; 
    char c; 
    int count; 

    if (ferror (stdin)) 
    { 
     fprintf(stderr, "error reading file\n"); 
     exit (1); 
    } 
    else 
    { 
     do { 
     buff = (char*) realloc (buff, n+1); 
     c = fgetc (stdin); 
     buff[n] = c; 
     if (c != EOF) 
      n++; 
    } 
     while (c != EOF); 
    } 
    printf("characters entered: "); 
    for (count = 0; count < n; count++) 
     printf("%s ", buff[count]); 
    free (buff); 

應該堅持讀書,直到文件的末尾,每次擴展內存,但是當我嘗試用簡單的文本文件,管道運行它,它告訴我,我有分段錯誤。我不太確定我做錯了什麼。

請注意,我們被允許使用malloc和whatnot,但我不明白如何使這項工作,因爲我們已經知道需要多少內存。

回答

2

好像被@dasblinkenlight和@smocking答案是當前的理由,但要避免下一個崩潰:

  1. 變化char c;int c;,因爲EOF是由一個以上的字符表示。
  2. 這是一個壞主意,一次調用一個字符的realloc,而不是每次增加X字節的大小(比方說100),這將會更加高效。
  3. 您需要在緩衝區末尾添加空終止符('\ 0'),否則 - 未定義的行爲在printf()
+0

啊,哎呦。我忘了那個。這似乎已經固定它與設置char * buff爲NULL。多謝你們! –

3

您在第一次調用realloc時使用了未分配的指針buf。更改爲

char *buf = malloc(100); 

避免此問題。

一旦你得到它的工作,你會發現你的程序效率很低,每個字符都有一個realloc。考慮以更大的塊重新分配以減少重新分配的次數。

+0

+1似乎目前的問題確實 – MByD

3
char* buff; 
... 
buff = (char*) realloc (buff, n+1); 

您試圖重新分配一個單位化的指針,導致未定義的行爲。更改爲

char* buff = 0; 
... 
buff = (char*) realloc (buff, n+1); 

但正如已經指出的,這是非常低效的。

+0

+1似乎確實是目前的問題 – MByD

0

這就是我想出了讀stdinchar[]char*(當stdin具有嵌入式NULL S):

char* content = NULL; 
char c; 
int contentSize = 0; 

while ((c = fgetc(stdin)) != EOF){ 
    contentSize++; 
    content = (char*)(realloc(content, contentSize+1)); 
    if (content == NULL) { 
     perror("Realloc failed."); 
     exit(2); 
    } 
    content[contentSize] = c; 
} 

for (int i = 0; i < contentSize; ++i) { 
    printf("%c",content[i]); 
}