2016-09-04 3 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

Мой хрустальный шар думает, что вы обрабатываете «буфер» как строку с нулевым завершением, которой она не является (если у вашего файла нет нуля в конце). – molbdnilo

ответ

0

если вы используете buffer = malloc(length);, а затем введите length байтов, это будет слишком короткий байт. Массивы Char в 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-Тест»; и результат печати: http://prntscr.com/ce6lmt – Kai

+0

@ Кай, это от запуска вышеуказанного кода без изменений? Я запустил его с указанным вами содержимым и просто продолжаю получать «10-тест»; вновь и вновь.Вы можете попробовать изменить открытый режим с «rb» на просто «r», так как мы просто читаем текст и видим, что это имеет значение. В противном случае, я не знаю. Вы можете найти SO для «fopen Windows», чтобы узнать, есть ли известные глюки. – cdlane

+0

Может быть, что-то еще в моей программе может вызвать это? Как ошибка в другом месте, и я вижу здесь только причину. В конце концов, я действительно просто пытаюсь прочитать текст из файла - не знаю, почему это кажется таким проклятым ... – Kai