打开160G的文本文件(big.txt)并检索里面的内容是包含good,如果有返回true,没有返回false。 如题,请教~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 太大了,用ifstream, 然后用ifstream::seekg移动文件指针,一块块的读,看看速度是否可以接受 只有循环分段读取,为避免将good单词拆分成2段,可每次多读取上次末尾3个字节 bool find_good( const char * strDest){ const int len = 4096; const int k = strlen(strDest); char * buf = new char[len+k]; memset( buf+len,0,k); FILE * fp = fopen("C:\\big.txt","rb"); while( !feof(fp)) { memmove(buf, buf+len, k); fread(buf+k,1,len, fp); char * p=buf; const char * end = buf+len; while( p< end) { if( memcmp(p,strDest,k)==0) { delete []buf; fclose(fp); return true; } ++p; } } delete []buf; fclose(fp);} 是WINDOWS下的文件么?有160G的文件吗? 刚才我做了个622M大小的文本(要做160G的偶硬盘没那么大),用 cppwin 给的方法试验了一下,程序大概用了19~20秒的时间算出结果!程序有几个地方不太明白,还请指教~bool find_good( const char * strDest){ const int len = 4096; // 这里用4096代表什么? const int k = strlen(strDest); char * buf = new char[len+k]; memset( buf+len,0,k); // 为什么要加"len"? FILE * fp = fopen("E:\\big.txt","rb"); while( !feof(fp)) { memmove(buf, buf+len, k); // 这里也一样,为什么要加"len"? fread(buf+k,1,len, fp); char * p=buf; const char * end = buf+len; while( p< end) { if( memcmp(p,strDest,k)==0) { delete []buf; fclose(fp); return true; } ++p; } } delete []buf; fclose(fp); return false;} 4096,4k 内存分配的最小单位是4K或8K,一般来说,根据CPU不同而不同,后面你可以看到可以通过系统函数得到区域粒度和页面粒度你分配的小了其实系统也是申请了4k,那就多要点. 第1个问题, 4096你可以自己定第2个问题, 也可以不加len第3个问题, 必须的,它是为了防止分段读入,恰好从 good 中间分开. 想不明白的一个消息路由问题 对话框之间数据传递 终于决定辞职了.散分 #if是什么意思 各位请教一个问题小弟用ADO连接mdb文件出现问题,帮帮小弟 一个接口带有两个返回值,在ASP里调用,是否能通过 关于写入EXCEL的效率问题! 关于 CWnd的 m_pCtrlSite 800分大放送,超难题,高手来看看!!! 高手请过目 关于类型转换问题 为什么在运行if (!ProcessShellCommand(cmdInfo))后出现 xxx.exe中的 0x5d1876e4 处最可能的异常: 0xC0000005: 读取位置 0xcdcdcdcd 时发生访问冲突
bool find_good( const char * strDest)
{
const int len = 4096;
const int k = strlen(strDest); char * buf = new char[len+k];
memset( buf+len,0,k);
FILE * fp = fopen("C:\\big.txt","rb");
while( !feof(fp))
{
memmove(buf, buf+len, k);
fread(buf+k,1,len, fp); char * p=buf;
const char * end = buf+len; while( p< end)
{
if( memcmp(p,strDest,k)==0)
{
delete []buf;
fclose(fp);
return true;
}
++p;
}
} delete []buf;
fclose(fp);}
用 cppwin 给的方法试验了一下,
程序大概用了19~20秒的时间算出结果!程序有几个地方不太明白,还请指教~
bool find_good( const char * strDest)
{
const int len = 4096; // 这里用4096代表什么?
const int k = strlen(strDest); char * buf = new char[len+k];
memset( buf+len,0,k); // 为什么要加"len"?
FILE * fp = fopen("E:\\big.txt","rb");
while( !feof(fp))
{
memmove(buf, buf+len, k); // 这里也一样,为什么要加"len"?
fread(buf+k,1,len, fp); char * p=buf;
const char * end = buf+len; while( p< end)
{
if( memcmp(p,strDest,k)==0)
{
delete []buf;
fclose(fp);
return true;
}
++p;
}
} delete []buf;
fclose(fp);
return false;
}
4096,4k
内存分配的最小单位是4K或8K,一般来说,根据CPU不同而不同,后面你可以看到可以通过系统函数得到区域粒度和页面粒度
你分配的小了其实系统也是申请了4k,那就多要点.
第2个问题, 也可以不加len
第3个问题, 必须的,它是为了防止分段读入,恰好从 good 中间分开.