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.但是这段代码有望跨平台.
任何帮助,将不胜感激.
编辑
这是更新的代码fread和ftell.
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)
我想知道这个函数的相对复杂性是什么?
您应该尝试查看函数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)