2013-02-08 3 views
0

Я создал функцию, которая читает файл в памяти на C. Но у меня проблема с кодом, случайные символы, похоже, появляются в конце строки. Даже после того, как я добавил «\ 0» в конце. Я не понимаю этого вообще, так как весь файл появляется, и у меня нет malloc'd достаточно места для большего количества символов, так что должна быть какая-то ошибка, если есть больше символов? В любом случае, кто-нибудь знает, что вызывает это?Случайная память появляется при чтении файла

char* LoadSourceFile(char* filename) 
{ 
    int fileSize; 
    char* buffer; 
    struct stat handle; 
    FILE* bestand; 

    stat(filename, &handle); 
    if (fopen_s(&bestand, filename, "r") != 0) { 
     return NULL; 
    } 

    fileSize = handle.st_size; 
    handle.st_size++; 
    buffer = (char*)malloc(handle.st_size); 
    if (buffer == NULL) { 
     return buffer; 
    } 

    fread_s(buffer, handle.st_size, fileSize, 1, bestand); 
    buffer[fileSize] = '\0'; 
    fclose(bestand); 

    return buffer; 
} 
+0

Это звучит, как вы читаете мимо конца файла, в результате чего на выходе мусора. – Julio

ответ

1

Посмотрите на возврат из fread_s, который является числом байтов, считанных в буфер. Это может быть меньше, чем ожидалось.

bytes_read = fread_s(buffer, handle.st_size, fileSize, 1, bestand); 
buffer[bytes_read] = '\0'; 

Edit: вам придется поменять параметры подсчета/размер, чтобы сделать то, что я сказал правильно:

bytes_read = fread_s(buffer, handle.st_size, 1, fileSize, bestand); 
buffer[bytes_read] = '\0'; 
+0

Возвращаемое значение равно 0 Хотя текст появляется. – para

+0

Кроме того, если ваш режим по умолчанию - «текст» (установите флажок fmode()), тогда некоторые символы будут переведены при чтении. Это может привести к тому, что число чтения будет меньше размера файла, указанного в stat. – PQuinn

1

Это

fread_s(buffer, handle.st_size, fileSize, 1, bestand); 

Должно быть

fread_s(buffer, handle.st_size, 1, fileSize, bestand); 

Согласно docs функции fread_s принимает следующее:

size_t fread_s(void *buffer,size_t bufferSize, size_t elementSize, size_t count, FILE *stream); 

буфер: место хранения данных.

bufferSize: размер буфера назначения в байтах.

elementSize: Размер элемента для чтения в байтах.

кол-во: Максимальное количество предметов для чтения.

поток: указатель на структуру FILE.

Вы устанавливаете elementSize в filesize, что означает каждый элемент filesize байтов, когда он должен быть 1 байт.

+0

Подкачка работала в сочетании с ответом Гуса, спасибо. – para

+0

@Ruben приветствуется, также не увеличивайте значение 'st_size', просто добавьте его, когда вы выделяете память, таким образом он менее запутан. – iabdalkader

0

Пожалуйста раздеть

handle.st_size++; 

И вставить

buffer = (char*)malloc(sizeof(char) * (handle.st_size + 1)); 

И

fread_s(buffer, handle.st_size + 1, 1, handle.st_size, bestand); 

Надеется, что это помогает :)

Смежные вопросы