如题,请教~

解决方案 »

  1.   

    太大了,用ifstream, 然后用ifstream::seekg移动文件指针,一块块的读,看看速度是否可以接受
      

  2.   

    只有循环分段读取,为避免将good单词拆分成2段,可每次多读取上次末尾3个字节
      

  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);}
      

  4.   

    是WINDOWS下的文件么?有160G的文件吗?
      

  5.   

    刚才我做了个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;
    }
      

  6.   


    4096,4k
      内存分配的最小单位是4K或8K,一般来说,根据CPU不同而不同,后面你可以看到可以通过系统函数得到区域粒度和页面粒度
    你分配的小了其实系统也是申请了4k,那就多要点.
      

  7.   

    第1个问题, 4096你可以自己定
    第2个问题, 也可以不加len
    第3个问题, 必须的,它是为了防止分段读入,恰好从 good 中间分开.