Чтение содержимого файла с неизвестным размером - PullRequest
3 голосов
/ 08 мая 2011

Я хочу обработать содержимое файла конфигурации.Файл конфигурации может быть любого размера.Я получаю ошибку шины после зависания программы, когда я запускаю следующий код:

FILE *fp;
struct stat st;
char *buffer;

fp = fopen(CONFIG_FILE, "r");
if (fp == NULL) {
    // error handling and cleanup omitted for brevity
}

fstat(fileno(fp), &st);
fread(buffer, sizeof(char), st.st_size, fp);
fprintf(stderr, "%s\n", *buffer);
fclose(fp);

Я прочитал, что ошибка шины может быть вызвана переполнением буфера.Я почти уверен, что получаю переполнение буфера с моим char *buffer.Но тогда, как я могу указать размер буфера во время выполнения?

EDIT - Ошибка шины была вызвана моей ленью жесткого кодирования 1Фред зов.Пример кода был обновлен, чтобы исправить это, вместо этого используется sizeof(char).

Ответы [ 3 ]

6 голосов
/ 08 мая 2011

Использование malloc(3).Поставьте:

buffer = malloc(st.st_size);

Перед вашим звонком на fread().Не забудьте освободить buffer, когда закончите с этим!

Вы, вероятно, тоже не хотите использовать *buffer в своем вызове printf().Если вы попытаетесь напечатать весь файл таким образом, вам нужно будет выделить дополнительный байт для завершения строки в нулевом конце.

2 голосов
/ 08 мая 2011

В C99, и если ваш файл конфигурации не должен быть в диапазоне MiB или больше, вы можете использовать VLA:

FILE *fp = fopen(CONFIG_FILE, "r");
if (fp == NULL) {
    // error handling and cleanup omitted for brevity
}

struct stat st;
fstat(fileno(fp), &st);  // Error check omitted
char buffer[st.st_size+1];
fread(buffer, sizeof(char), st.st_size, fp);
buffer[st.st_size] = '\0';
fprintf(stderr, "%s\n", *buffer);
fclose(fp);
2 голосов
/ 08 мая 2011

Вы можете выделить память с помощью malloc:

buffer = malloc(number_of_bytes_to_allocate);
if(buffer == NULL) {
    // error allocating memory
}

free, когда вы закончите с этим!

free(buffer);
...