2017-11-17 238 views
1

所以我有一個文件,作爲一些文本,我希望我的函數讀取該文件並將其存儲在一個數組上。我做了一些代碼,當我打印我的動態數組時,它會打印垃圾值:<幫助。C語言 - >讀取文件到動態數組

char* read_message(char *filename) 
{ //gets the PATH of the txt file 
    char *file_contents; 
    long input_file_size; 
    FILE *input_file = fopen(filename, "r"); 
    if(input_file == NULL)       
    { 
     return NULL; 
    } 
    fseek(input_file, 0, SEEK_END);  
    input_file_size = ftell(input_file);   
    rewind(input_file);       
    file_contents = (char*)malloc(input_file_size+1 * (sizeof(char)));  
    fread(file_contents, input_file_size, 1, input_file); 
    printf("%s",file_contents);//----Prints crap-------- 
    fclose(input_file); 
                // returns the address to the array of strings 
    return file_contents;  
}  
+5

請在此處發佈您的代碼,而不是代碼的圖像。 – AntonH

+4

請將代碼作爲文本發佈,而不是文本圖片或文本圖片的鏈接。同時發佈您的輸入,預期輸出和實際輸出。 – dbush

+0

只是好奇:你爲什麼分配'input_file_size + 1'? ''最後'+ 1'是最基本的(請參閱@dbush [answer](https://stackoverflow.com/a/47359654/2436175)),但我想知道你是怎麼想出來的,如果你沒有了解終止角色。 – Antonio

回答

1

您將文件的內容讀入char數組中。那時你還沒有一個字符串,而是一個字符數組,因爲末尾沒有終止的空字節。

然後,當您使用printf來打印該數組時,它會在分配的內存段末尾讀取未初始化的字節(可能還有幾個字節,它不是已分配內存的一部分)。讀取未初始化的字節將調用undefined behavior

,因爲調用fread不添加什麼閱讀後終止空字節,你需要做的是自己:

fread(file_contents, input_file_size, 1, input_file); 
file_contents[input_file_size] = 0; 
+0

我會強調分配'input_file_size + 1'的重要性,因爲某些奇怪的原因,OP已經做得正確。 – Antonio

1

問題立即違規printf()之前。

file_contents = (char*)malloc(input_file_size+1 * (sizeof(char)));  
fread(file_contents, input_file_size, 1, input_file); 
printf("%s",file_contents);//----Prints crap-------- 

fread()執行二進制讀取。它不會將零終結符添加到file_contents。如果從文件讀取的數據中沒有值爲零的字符,則printf()調用具有未定義的行爲。

也不是fread()通常假定文件也打開二進制閱讀以及。您的open()語句不以二進制模式打開文件。

0

的另一個問題是:

您寫道:

malloc(input_file_size + 1 * (sizeof(char)); 

優先進入乘法,所以它相當於:

malloc(input_file_size + (sizeof(char)); 

您應該添加括號。