2016-09-04 121 views
-3

我在读取文件中的字符串。在第二次或第三次执行函数之后,一个或多个随机字符会附加到缓冲区字符串中,我不知道为什么会发生这种情况。从文件读取失败

下面是一段代码:

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

你'printf'是'hiscore.dat'的结果吗? –

+3

我的水晶球认为你将'buffer'视为一个零终止的字符串,它不是(除非你的文件末尾有零)。 – molbdnilo

回答

0

如果您使用buffer = malloc(length);,然后读取length字节,它将会是一个字节太短。 C中的Char数组是零终止的,所以它们需要一个额外的字节,但是零。 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

@开,这是从上面的代码未经修改运行?我用你提到的内容来运行它,并继续进行“10测试”;一遍又一遍。您可能会尝试将打开模式从“rb”更改为“r”,因为我们只是阅读文本,看看是否有所作为。否则,我不知道。你可以搜索SO来“打开Windows”,看看是否有已知的故障。 – cdlane

+0

是否可能是在我的程序中可能会导致此问题?就像其他地方的bug一样,我只能在这里看到原因。 毕竟我真的只是试图从文件中读取文本 - 不知道它为什么如此诅咒...... – Kai