gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:14:31 24 4
gpt4 key购买 nike

我正在尝试从一个文本文件中读取所有内容。这是我写的代码。

#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;
}
}

这是用法

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

由于我是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;
}

我想知道这个函数的相对复杂度是多少?

最佳答案

您应该尝试查看函数 fsize(关于 fsize,请参阅下面的更新)和 fread。这可能是一个巨大的性能改进。

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

使用fread 对文件进行分块读取。这比读取文件的单个字符要快得多。

像这样:

long size = fsize(fp);
fcontent = malloc(size);
fread(fcontent, 1, size, fp);

更新

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

fseek(fp, 0, SEEK_END); 
size = ftell(fp);
fseek(fp, 0, SEEK_SET);

关于c - 从文本文件中读取所有内容 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3381080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com