读取未知大小的文件内容
我想处理配置文件的内容。 配置文件可以是任何大小。 程序挂起后,当我运行以下代码时,我收到一个总线错误:
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)
更新代码示例以解决此问题。
使用malloc(3)
。 放:
buffer = malloc(st.st_size);
在你打电话给fread()
。 完成后不要忘记释放buffer
!
您可能也不想在printf()
调用中使用*buffer
。 如果你打算尝试像这样打印整个文件,你需要确保分配一个额外的字节来空终止你的字符串。
你可以用malloc
分配内存:
buffer = malloc(number_of_bytes_to_allocate); if(buffer == NULL) { // error allocating memory }
当你完成它时free
!
free(buffer);
在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);