以前面对的文本文件都是像C++代码那样,一行一行的,那么本人用
InFile.open("textfile.txt",ios::in);
while(getline(InFile,bufferstr))
{
//略
}
这种方式逐行读入,每一行根据上下做算法数据处理,也就完事了。
最近遇到一些文件,像一些html文件什么的,生成的文本文件没有回车符,非常紧凑的,那么本人用
ifstream in("test.txt", ios::in);
istreambuf_iterator<char> beg(in), end;
string strdata(beg, end);
in.close();
可以把文本文件读入到strdata,对string对象做处理也可以把事情办了,
现在问题来了,
假如test.txt有4G的体积大小,那么本人机器只有2G内存,用这种方式把全部内容都读入到 内存的方式似乎不太好?
这种不分行的文本,怎样处理会比较好?
ps:处理文本的工作,无非就是这几个步骤,找到匹配字段的位置(int nPos),在nPos位置开始,以另外一个匹配字段找到
int iPos,在nPos和iPos区间找到nPos + 6的位置,插入一个String字符串,再以iPos位置为开始,向后面继续寻找,直到找不到为止。
解决方案
2
神马系统生成的txt可以放任的达到4G。这不科学
20
假如是html,由于其具备典型的结构,可以使用流式解析,参见XML的流式解析,库很多的,例如xmllite 和Qt的XML流式类
18
仅供参考:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char ln[MAXLEN];
FILE *f;
int i,z;
int b,n,L;
int main(int argc,char **argv) {
if (argc<2) {
printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);
return 1;
}
f=fopen(argv[1],"r");
if (NULL==f) {
printf("Can not open file [%s]!\n",argv[1]);
return 2;
}
z=0;
b=0;
n=0;
L=0;
while (1) {
if (NULL==fgets(ln,MAXLEN,f)) break;
L=strlen(ln);
if ("\n"==ln[L-1]) {
if (0==z) {
for (i=0;i<L-1;i++) {
if (!(" "==ln[i] || "\t"==ln[i])) break;
}
if (i<L-1) z=1;//当前行不是空行
}
if (0==z) b++; else n++;
z=0;
} else {
if (0==z) {
for (i=0;i<L;i++) {
if (!(" "==ln[i] || "\t"==ln[i])) break;
}
if (i<L) z=1;//当前行不是空行
}
}
}
fclose(f);
if (L>0 && "\n"!=ln[L-1]) {
if (0==z) b++; else n++;//最后一行末尾无"\n"也计算
}
printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);
return 0;
}
10
直接用istreambuf_iterator遍历就可以了, 不需要放到一个string里面.