如何将txt文件中的上千万个数据读取到一个数组中去

羽殇1003 2016-02-25 05:08:19
加精
各位大牛们:
你们好,小的我在编程的时候遇到一个问题,想请你们求教下:
我编写了一个如下的代码读取txt文件的数据
const int maxnum = 2540000
typedef struct Edge{
int u, v; // 起点,重点
double weight; // 边的权值
}Edge;
Edge edge[maxnum];

in.open(largeEWD.txt");
char buffer[1024];
const char* delim=" ";
in.getline(buffer,1024);
int j=0;
while(in.good())
{
char* pch=strtok(buffer,delim);
edge[j].u=atoi(pch);
pch=strtok(NULL,delim);
edge[j].v=atoi(pch);
pch=strtok(NULL,delim);
edge[j].weight=atof(pch);
cout<<edge[j].u<<" "<<edge[j].v<<" "<<edge[j].weight<<endl;
in.getline(buffer,1024);
j++;
}
其中maxnum是根据txt中edge的量来决定的。txt中数据格式是规律的,每行都是1 2 3这种格式。
在当txt中edge的数量只有几千的时候读取没问题,但是当txt中edge的数量到达千万条时,我即使设置了Edge[20000000]的数组,但是还是读取不完,我测试过了,最多读取24万多个数据,然后程序就直接结束了。这是什么原因呢?
...全文
4059 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
小圣_fighting 2016-03-07
  • 打赏
  • 举报
回复
学习学习了~
赵4老师 2016-03-01
  • 打赏
  • 举报
回复
仅供参考:
//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <search.h>
#define MAXCHARS 512
int MAXLINES=10000,MAXLINES2;
char *buf,*buf2;
char PROG[256]="PROG";//程序Program需要的文件列表
char LIST[256]="LIST";//dir /b /s生成的实际文件列表List
FILE *fp,*fl;
int i,c,n,L,hh;
int ignore_case=0;
char ln[MAXCHARS];
int icompare(const void *arg1,const void *arg2) {
   return stricmp((char *)arg1,(char *)arg2);
}
int compare(const void *arg1,const void *arg2) {
   return strcmp((char *)arg1,(char *)arg2);
}
int main(int argc,char **argv) {
    if (argc>1) strcpy(PROG,argv[1]);//命令行参数1覆盖PROG
    if (argc>2) strcpy(LIST,argv[2]);//命令行参数2覆盖LIST
    if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
    if ((fl=fopen(LIST,"rt"))==NULL) {
        fprintf(stderr,"Can not open %s\n",LIST);
        fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
        return 1;
    }
    if ((fp=fopen(PROG,"rt"))==NULL) {
        fclose(fl);
        fprintf(stderr,"Can not open %s\n",PROG);
        fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
        return 2;
    }
    buf=(char *)malloc(MAXLINES*MAXCHARS);
    if (NULL==buf) {
        fclose(fl);
        fclose(fp);
        fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);
        return 4;
    }
    n=0;
    hh=0;
    i=0;
    while (1) {
        if (fgets(ln,MAXCHARS,fl)==NULL) break;//
        hh++;
        L=strlen(ln)-1;
        if ('\n'!=ln[L]) {//超长行忽略后面内容
            fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",LIST,hh,MAXCHARS);
            while (1) {
                c=fgetc(fl);
                if ('\n'==c || EOF==c) break;//
            }
        }
        while (1) {//去掉行尾的'\n'和空格
            if ('\n'==ln[L] || ' '==ln[L]) {
                ln[L]=0;
                L--;
                if (L<0) break;//
            } else break;//
        }
        if (L>=0) {
            strcpy(buf+i,ln);i+=MAXCHARS;
            n++;
            if (n>=MAXLINES) {
                MAXLINES2=MAXLINES*2;
                if (MAXLINES2==1280000) MAXLINES2=2500000;
                buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);
                if (NULL==buf2) {
                    free(buf);
                    fclose(fl);
                    fclose(fp);
                    fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);
                    return 5;
                }
                buf=buf2;
                MAXLINES=MAXLINES2;
            }
        }
    }
    fclose(fl);
    if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
    else qsort(buf,n,MAXCHARS,compare);
    hh=0;
    while (1) {
        if (fgets(ln,MAXCHARS,fp)==NULL) break;//
        hh++;
        L=strlen(ln)-1;
        if ('\n'!=ln[L]) {//超长行忽略后面内容
            fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",PROG,hh,MAXCHARS);
            while (1) {
                c=fgetc(fp);
                if ('\n'==c || EOF==c) break;//
            }
        }
        while (1) {//去掉行尾的'\n'和空格
            if ('\n'==ln[L] || ' '==ln[L]) {
                ln[L]=0;
                L--;
                if (L<0) break;//
            } else break;//
        }
        if (L>=0) {
            if (ignore_case) {
                if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln);
            } else {
                if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln);
            }
        }
    }
    fclose(fp);
    free(buf);
    return 0;
}
muzi_li90 2016-03-01
  • 打赏
  • 举报
回复
学习一下。。。。
伊顺鸣 2016-03-01
  • 打赏
  • 举报
回复
好帖啊!难得一见的好贴。。。
wjj988jkmk 2016-02-29
  • 打赏
  • 举报
回复
看不懂了哎………………
Heart09 2016-02-29
  • 打赏
  • 举报
回复
用new Edge[......]试试
cattpon 2016-02-29
  • 打赏
  • 举报
回复
learning~
赵4老师 2016-02-29
  • 打赏
  • 举报
回复
通常情况下容量大小从小到大: 寄存器、Cache、内存(栈、全局数据区、堆)、文件、磁盘、云盘
void_main_void 2016-02-28
  • 打赏
  • 举报
回复
栈小了。通常大数据都是用过 malloc堆出来存放以及使用而不是用栈。
zghftn 2016-02-28
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/391907128?page=1#post-400875839
starytx 2016-02-27
  • 打赏
  • 举报
回复
可以new一个比较大的数组来保存,一个不行就多来几个分开装
ooolinux 2016-02-26
  • 打赏
  • 举报
回复
Edge edge[maxnum]; 这条语句实在某个函数内部还是在函数外部? 在函数内部是分配在栈上的,栈的大小通常只有几M。 在函数外部是分配在全局内存区的,一般只受内存大小限制。 也可以动态分配内存,就是分配在堆上,和全局内存区差不多的。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧