如何读取一个大文件(最多2 000 000 000个字符)并存储它们

时间:2013-09-30 17:32:50

标签: c overflow buffer

我正在尝试解决一个问题,因为我有一个包含迷宫的输入文件,我知道如何解决迷宫,但我不知道如何存放迷宫。 我无法将它存放在char数组中,因为该文件最多可以有2亿个字符。 我不知道如何在不爆炸缓冲区的情况下存储文件... 使用read命令读取文件(不允许使用fread)。

3 个答案:

答案 0 :(得分:2)

根据您的描述,您需要阅读迷宫,然后存储已解决迷宫的副本。

让我们假设您的迷宫将被存储为一个二维的字符数组,其中一个字符代表砖墙 - 例如。 '*' - 另一个是开放空间 - 例如'' - ,所以一个小的8 x 8迷宫看起来像这样:


    ****** *
    *      *
    * **** *
    * *    *
    * *** **
    *   *  *
    *** ****
    *** **** 

然后你需要做你的解决,并用一个字符存储迷宫,代表解决它的路径的步骤。其中 - 假设char是'+',它将如下所示:


    ******+*
    *++++++*
    *+ *** *
    *+ *   *
    *+*** **
    *+++*  *
    ***+****
    ***+****

它是我 - 并且是使用小内存的目标 - 我要做的第一件事就是将迷宫转换为位,其中星号将由1表示,空格由0表示。结果地图会小8倍。然后我会做我的解决,但是我不能在地图中存储'+'-bits只能有2个值 - 我会将每个步骤的位置存储在链表上。然后我将通过读取地图的每个位置并在列表中检查它来保存输出迷宫,如果它在那里我将输出'+',否则我将检查该位并输出'*'如果它是1,并且''如果是0。

就像这是一个大学项目,我不会在这里给你所有的代码 - 你应该自己编写 - 但我会给你足够的线索一些未经优化的代码。 ;-)

struct pos {
    int x,y;
    struct pos *next;
};

struct pos *step_list=NULL;

#define MAZE_WIDTH_BITS  ((MAZE_WIDTH + 7) / 8)

unsigned char bitmaze[MAZE_HEIGHT][MAZE_WIDTH_BITS];

int getbit(int x,int y)
{
    unsigned char v = bitmaze[y][(x / 8)];


    v >>= 7 - (x % 8);
    return (v & 1);
}


void save_maze(FILE *fp)
{
    int x,y,found;
    struct pos *cur_step;

    for(y=0;y<MAZE_HEIGHT;y++)
    {
        for(x=0;x<MAZE_WIDTH;x++)
        {
            found=0;
            cur_step=step_list;
            while(cur_step && !found)
            {
                if(cur_step->x==x && cur_step->y==y)
                     found=1;
                else
                    cur_step=cur_step->prox;
            }
            if(found)
                fputc('+',fp);
            else
                fputc( getbit(x,y) ? '*' : ' ',fp);
        }
    }
}

struct pos { int x,y; struct pos *next; }; struct pos *step_list=NULL; #define MAZE_WIDTH_BITS ((MAZE_WIDTH + 7) / 8) unsigned char bitmaze[MAZE_HEIGHT][MAZE_WIDTH_BITS]; int getbit(int x,int y) { unsigned char v = bitmaze[y][(x / 8)]; v >>= 7 - (x % 8); return (v & 1); } void save_maze(FILE *fp) { int x,y,found; struct pos *cur_step; for(y=0;y<MAZE_HEIGHT;y++) { for(x=0;x<MAZE_WIDTH;x++) { found=0; cur_step=step_list; while(cur_step && !found) { if(cur_step->x==x && cur_step->y==y) found=1; else cur_step=cur_step->prox; } if(found) fputc('+',fp); else fputc( getbit(x,y) ? '*' : ' ',fp); } } }

希望这对你有所帮助。 guilleamodeo。

答案 1 :(得分:0)

为什么不为2000000000 char数组分配内存?唯一的限制是你的电脑内存。如果剩下足够的连续地址空间,则没有问题。

您可以尝试char *my_maze = (char*) malloc((2000000000 * sizeof(char)));

之类的内容

答案 2 :(得分:0)

你可以使用链接列表,其中每个节点都包含一个字符,它需要很多,很多空间,但它会这样做