我尝试使用以下代码阅读一些文件:
#define RESPONSE_MAX_LENGTH (1024 * 1024) // Should be 1MB
char file_content[RESPONSE_MAX_LEGNTH];
memset(&file_content, 0, RESPONSE_MAX_LEGNTH);
request_get_file("/User/...", file_content);
int request_get_file(char* requested_file_path, char* buf) {
int file_size = 0;
FILE* fp = NULL;
if ((fp = fopen(requested_file_path, "r+")) == NULL) {
return errno;
}
fseek(fp, 0L, SEEK_END);
file_size = (int)ftell(fp);
rewind(fp);
errno = 0;
if (fread(buf, 1, file_size, fp) == 0) {
if (!feof(fp)) {
if (ferror(fp)) {
printf("An error occured while reading the requested file. File size: %d\n", file_size);
perror("fread()");
return errno;
}
}
}
fclose(fp);
}
我能够读取.txt文件,但是当我打开一个html文件时,我收到一个错误说:
fread(): Bad address
(用perror创建(" fread"))
errno = 14
出于某种原因,此错误仅针对某些特定文档发生。
解决方案:
我刚刚意识到问题似乎与特定文件有关。将test.html重命名为test.txt并尝试打开此错误后,错误仍然存在。这可能与文件内容有关吗? => 是,因为我写的数据的缓冲区太小了。
如何解决此问题?
答案 0 :(得分:0)
问题是我写的缓冲区太小而无法容纳fread()
读取的所有数据。
我的更新代码:
char* buf = NULL;
request_get_file("/User/...", &buf);
int request_get_file(char* requested_file_path, char** buf) {
int file_size = 0;
FILE* fp = NULL;
if ((fp = fopen(requested_file_path, "r+")) == NULL) {
return errno;
}
fseek(fp, 0L, SEEK_END);
file_size = (int)ftell(fp);
rewind(fp);
errno = 0;
if ((*buf = calloc(file_size + 1, sizeof(char))) == NULL) {
perror("calloc()");
return errno;
}
if (fread(*buf, 1, file_size, fp) == 0) {
if (!feof(fp)) {
if (ferror(fp)) {
printf("An error occured while reading the requested file. File size: %d\n", file_size);
perror("fread()");
return errno;
}
}
}
fclose(fp);
}