首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

下万个字符串,用什么数据结构保存

2013-02-02 
上万个字符串,用什么数据结构保存?我写的一个MFC程序,用CFileFind查找目录下的所有的两万多个txt文件,要把

上万个字符串,用什么数据结构保存?
我写的一个MFC程序,用CFileFind查找目录下的所有的两万多个txt文件,要把这两万个文件名,每个文件名放在一个字符串里,也就是两万个字符串,这两万个字符串要以什么形式保存在内存中呢?
我想了很多方法,但总觉得效率不太高。
方法一:CString数组,把每一个字符串放到CString对象里。CString *strFileName = new CSting[nFile]; //nFile为文件数量,也就是两万多。
方法二:MFC提供的集合类字符串数组CStringArray类。CStringArray strFileName;
strFileName.setsize(nFile);这个类相当于CString数组,可以随时、自动调整大小。但越是封装了太多功能,我怕效率越不高。
方法三:二维CHAR型数组,两万个CHAR型指针,每个指针分别指向一个字符串。(new和delete的时候比较麻烦)
方法四:链表?
还要注意的是,现在只是两万个字符串,如果要导入五万个、十万个甚至更多,这数量在编译阶段是不确定的。
大家有什么高见?跪求!
[解决办法]
那么用STL中的vector和list会比较好一些。

引用:
只是保存到内存里,不需要永久保存。用途就是,在后面的代码里,我要一个一个的把TXT文件读出来进行一些字符处理再写回去。所以这些文件名保存在内存里备用,因为打开每一个文件时需要用到文件路径,到时候我用路径+文件名就得到了它的绝对路径,然后用CFile类打开。

[解决办法]
引用:
只是保存到内存里,不需要永久保存。用途就是,在后面的代码里,我要一个一个的把TXT文件读出来进行一些字符处理再写回去。所以这些文件名保存在内存里备用,因为打开每一个文件时需要用到文件路径,到时候我用路径+文件名就得到了它的绝对路径,然后用CFile类打开。
既然这样那就list存就可以了,插入删除都快的
[解决办法]
仅供参考
//输出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;
}


[解决办法]
LZ的四个方法都挺好的。
先功能后性能,不要急着优化。

热点排行