【发布时间】:2011-03-23 19:18:36
【问题描述】:
我正在尝试从文本文件中读取所有内容。这是我写的代码。
#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。但是这个代码预计是跨平台的。
任何帮助将不胜感激。
编辑
这是带有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;
}
我想知道这个函数的相对复杂性是多少?
【问题讨论】:
-
我几乎不认为使用它作为文件名会给你带来很多荣誉
-
啊……对不起。我正在测试并忘记删除它。非常抱歉。
-
我认为一般来说你应该尝试在固定的块中工作;因此在这种情况下,您将一次读取 PAGE_SIZE 个字节(如果是最后一个块,则读取更少)并在读取每个块时打印它们。
-
如果您没有“filename.txt”的读取权限,您知道您的代码会做什么吗?这是你想要它做的吗?
-
您应该将
c设为int。 ([f|]getc()返回整数)
标签: c file-io dynamic-memory-allocation