从文本文件中读取所有内容 - C.

Nav*_*K N 4 c file-io dynamic-memory-allocation

我试图从文本文件中读取所有内容.这是我写的代码.

#include <stdio.h>
#include <stdlib.h>

#define PAGE_SIZE 1024

static char *readcontent(const char *filename)
{
    char *fcontent = NULL, c;
    int index = 0, pagenum = 1;
    FILE *fp;
    fp = fopen(filename, "r");

    if(fp) {
        while((c = getc(fp)) != EOF) {
            if(!fcontent || index == PAGE_SIZE) {
                fcontent = (char*) realloc(fcontent, PAGE_SIZE * pagenum + 1);
                ++pagenum;
            }
            fcontent[index++] = c;
        }
        fcontent[index] = '\0';
        fclose(fp);
    }
    return fcontent;
}

static void freecontent(char *content)
{
    if(content) {
        free(content);
        content = NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是用法

int main(int argc, char **argv)
{
    char *content;
    content = readcontent("filename.txt");
    printf("File content : %s\n", content);
    fflush(stdout);
    freecontent(content);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于我是C的新手,我想知道这段代码是否完美无缺?你看到有什么问题/改进吗?

使用的编译器:GCC.但是这段代码有望跨平台.

任何帮助,将不胜感激.

编辑

这是更新的代码freadftell.

static char *readcontent(const char *filename)
{
    char *fcontent = NULL;
    int fsize = 0;
    FILE *fp;

    fp = fopen(filename, "r");
    if(fp) {
        fseek(fp, 0, SEEK_END);
        fsize = ftell(fp);
        rewind(fp);

        fcontent = (char*) malloc(sizeof(char) * fsize);
        fread(fcontent, 1, fsize, fp);

        fclose(fp);
    }
    return fcontent;
}
Run Code Online (Sandbox Code Playgroud)

我想知道这个函数的相对复杂性是什么?

Mar*_*sen 7

您应该尝试查看函数fsize(关于fsize,请参阅下面的更新)和fread.这可能会带来巨大的性能提升.

使用fsize让您正在阅读的文件的大小.使用此大小仅执行一次内存分配.(关于fsize,请参阅下面的更新.获取文件大小和执行一个alloc的想法仍然相同).

用于fread阻止读取文件.这比单个charecter读取文件要快得多.

像这样的东西:

long size = fsize(fp);
fcontent = malloc(size);
fread(fcontent, 1, size, fp);
Run Code Online (Sandbox Code Playgroud)

更新

不确定fsize是否是跨平台的,但您可以使用此方法来获取文件的大小:

fseek(fp, 0, SEEK_END); 
size = ftell(fp);
fseek(fp, 0, SEEK_SET); 
Run Code Online (Sandbox Code Playgroud)