English 中文(简体)
阅读文本档案的所有内容——C
原标题:Reading all content from a text file - C
  • 时间:2010-08-01 06:54:26
  •  标签:
  • c
  • file-io

我正试图从文本档案中读到所有内容。 这里是我写的法典。

#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] =   ;
        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
", content);
    fflush(stdout);
    freecontent(content);
    return 0;
}

自2006年以来 我对C来说是新的,我想知道这一法典是否完美? 你们是否看到任何问题/改进?

Compiler使用: 海湾合作委员会。 但是,这一守则可望成为跨平台。

希望得到任何帮助。

<><>Edit>/strong>

此处为附有<编码>的增订代码<>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;
}

我想知道这一职能的相对复杂程度如何?

最佳回答

您应研究<代码>fsize(About fsize,见)和fread。 这可能是巨大的业绩改进。

使用<代码>fsize,使你能够阅读文件。 只利用这个规模做一次记忆。 (About fsize,见下文最新情况。) 查阅档案和做一件事的想法仍然是相同的

使用<代码>fread,阻止对文档进行阅读。 这比对档案进行单笔试读要快得多。

与此类似:

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

<>Update>

不能确定碎块是跨平台,但你可以采用这种方法来掌握档案的大小:

fseek(fp, 0, SEEK_END); 
size = ftell(fp);
fseek(fp, 0, SEEK_SET); 
问题回答

人们通常要读到现有规模的两倍,才能获得固定时间而不是线。 这使缓冲区的面积不超过两倍,通常为oka,在你回任后,你可以选择重新定位到正确的面积。

但是,对于档案规模而言,甚至更好的是stat(2),并分配一次(如果档案规模变化不定,可增加一些房间)。

另外,你为什么不按特性读写(fgets(3),或者甚至更糟的是mmap(2)整个事物(或有关空白,如果它过于庞大,用于记忆)。

这可能比以下方面更缓慢,而且肯定更复杂:

while((c = getc(fp)) != EOF) {
    putchar(c);
}

这与你的法典相同。

这是从速读到的,因此,我可能忽略了几个问题。

第一,a = 实际loc(a, ......);是错误的。 如果realloc(>>失败,该代码<>NUL,但无原始记忆。 由于你改用了<代码>a,原始记忆被丢失(即,是传闻)。 这样做的正确方式是:tmp = realloc(a, ...);如果(mp) a = tmp;等。

其次,关于使用<代码>fseek(fp, 0, SEEK_END);确定文档尺寸的问题,指出这可能或可能不会奏效。 如果档案没有随机查阅(例如st),那么你就能够回头阅读。 此外,fseek() 随附ftell(>,对双亲档案不得产生有意义的结果。 就案文档案而言,它不能给你可以读到的特性数目。 关于这个专题的一些有用信息是:comp.lang.c. FAQ question 19.2

另外,在您的原法典中,如果你的文件长度大于<条码>2*PAGESIZE,你将超出缓冲。

www.un.org/Depts/DGACM/index_french.htm

static void freecontent(char *content)
{
    if(content) {
        free(content);
        content = NULL;
    }
}

无用。 更正应只对原文提出。 就像你写一份职能文件setzero。 类似:

void setzero(int i) { i = 0; }

一个更好的想法是,保持记忆的循环,而不是比需要多少东西。

您的编号为malloc()或realloc(>,载于C,因为 und * 隐含地转换为C中的任何其他反对点。

希望会有所帮助。

One problem I can see here is variable index which is non-decreasing. So the condition if(!fcontent || index == PAGE_SIZE) will be true only once. So I think check should be like index%PAGE_SIZE == 0 instead of index == PAGE_SIZE.

在SPOSIX系统(例如气球)上,你可以与该系统取得同样的效果,即:mmap,该编码将你的所有档案都用于记忆中。 如果你改变缓冲,可以选择绘制copy on letter的地图,这样,如果你改变这一档案,你就会超过你的档案。

这通常会提高效率,因为你离开了你能够进入该系统的行列。 不需要<代码>realloc或类似。

尤其是,如果你只是读书,而且有几个过程确实如此,那么整个系统只有一份复印件。





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签