2016-09-04 19 views
-3

ファイルから文字列を読み込みました。関数が2回目または3回目のように実行された後、バッファー文字列に1つ以上のランダムな文字が追加され、なぜそれが起こるのかわかりません。ここでファイルからの読み込みに失敗しました

は、コードの一部です:

scorefile = fopen("highscore.dat", "rb"); 

if (scorefile) 
{ 
    fseek(scorefile, 0, SEEK_END); 
    length = ftell(scorefile); 
    fseek(scorefile, 0, SEEK_SET); 
    buffer = malloc(length); 
    if (buffer) 
    { 
     fread(buffer, 1, length, scorefile); 
    } 
    fclose(scorefile); 
} 

私はここで何か間違ったことをやっていますか?

+1

どのようにいくつかのデバッグを行うこと、および/または適切な[エラー処理]を実装について(http://stackoverflow.com/questions/21267716/error-ファイルオープン処理中)? –

+0

'hiscore.dat'の結果を' printf'しますか? –

+3

私のクリスタルボールは、 'buffer'をゼロ終了文字列として扱っていると考えています。これは(ファイルの末尾にゼロがない限り)そうではありません。 – molbdnilo

答えて

0

buffer = malloc(length);を使用してlengthバイトを読み取ると、1バイトが短すぎます。 Cの文字配列はゼロ終端なので、余分なバイトが必要ですが、そのゼロは必要です。 buffer = malloc(length+1);これを修正します。

+0

残念ながら、それはしませんでした。 – Kai

1

さんはそれをすべて綴ると少しより堅牢に行こう:

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 

char *loadScoreFile(const char *filename) 
{ 
    char *buffer = NULL; 

    FILE *scorefile = fopen(filename, "r"); 

    if (scorefile != NULL) 
    { 
     (void) fseek(scorefile, 0, SEEK_END); 
     int length = ftell(scorefile); 

     (void) fseek(scorefile, 0, SEEK_SET); 

     buffer = malloc(length + 1); 

     if (buffer != NULL) 
     { 
      assert(length == fread(buffer, 1, length, scorefile)); 

      buffer[length] = '\0'; 
     } 
     (void) fclose(scorefile); 
    } 

    return buffer; 
} 

int main() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     char *pointer = loadScoreFile("highscore.dat"); 

     if (pointer != NULL) 
     { 
      printf("%s", pointer); 
      free(pointer); 
     } 
    } 

    return 0; 
} 
+0

スコアファイルの内容は「10-Test;」です。印刷結果は次のようになります。http://prntscr.com/ce6lmt – Kai

+0

@Kai、上記のコードは変更されていないからですか?私はあなたが言及した内容でそれを走らせて、ただ "10-Test"を得続けています。何度も。オープンモードを "rb"から単に "r"に変更しようとするかもしれません。なぜなら、単にテキストを読んでいて、違いがあるかどうかを見るからです。そうでなければ、私は知らない。 「fopen Windows」のためにSOを検索して、既知の不具合があるかどうかを確認することができます。 – cdlane

+0

私のプログラム内の他の何かがこれを引き起こす可能性がありますか?他のどこかのバグのように、私はここで原因を見るだけです。 結局のところ、ファイルからテキストを読み込もうとしているのですが、どうしてそんなに呪われているのかわかりません... – Kai

関連する問題