为什么fread()不适用于具有html内容的文件?

时间:2018-01-31 14:17:17

标签: html c

我尝试使用以下代码阅读一些文件:

#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并尝试打开此错误后,错误仍然存​​在。这可能与文件内容有关吗? => ,因为我写的数据的缓冲区太小了。

如何解决此问题?

1 个答案:

答案 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);
}