2017-11-17 7 views
1

私はファイルをいくつかのテキストとして用意しています。そのファイルを読み込んで配列に格納する機能が必要です。私はいくつかのコードを行いました。動的配列を印刷すると、ひどい値が表示されます:< help。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を呼び出すと読んでいたものの後に終端のNULLバイトを追加していないので、あなたは自分で行う必要があります。

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

私は 'input_file_size + 1'を割り当てることの重要性を強調しています。 – 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)); 

関連する問題