读取未知大小的文件内容

时间:2011-05-08 04:15:07

标签: c stdio

我想处理配置文件的内容。配置文件可以是任何大小。程序挂起后,当我运行以下代码时,我收到一个总线错误:

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缓冲区溢出了。但是,如何在运行时指定缓冲区的大小?

编辑 - 总线错误是由于我在网络电话中对硬编码1的懒惰造成的。代码示例已更新为修复此问题,而是使用sizeof(char)

3 个答案:

答案 0 :(得分:6)

使用malloc(3)。放:

buffer = malloc(st.st_size);

致电fread()之前。完成后不要忘记免费buffer

您可能也不想在*buffer电话中使用printf()。如果你打算尝试打印整个文件,你需要确保分配一个额外的字节来空终止你的字符串。

答案 1 :(得分:2)

您可以使用malloc分配内存:

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

free当你完成它的时候!

free(buffer);

答案 2 :(得分:2)

在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);