着急哇。

解决方案 »

  1.   

    没啥高效的办法,无非都是从头开始扫描,逐个地数 '\n' 的个数。要说快速嘛,CreateFileMapping() ? 快吗?也许,未必。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  2.   

    不好意思,忘了问了,你说的“快速高效”,是指“开发效率”还是“运行效率”? :)
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  3.   

    很简单啊。void ReadSomeLines( LPCTSTR lpszSrcFile, LPCTSTR lpszTagFile, int nStartLine, int nLines )
    {
        HANDLE hSrc = INVALID_HANDLE_VALUE;
        HANDLE hTag = INVALID_HANDLE_VALUE;
        int nCurLines = 0;
        BOOL bSaved = ( nStartLine == 0 );
        DWORD dwReaded;    __try
        {
            hSrc = CreateFile( GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
            if( hSrc == INVALID_HANDLE_VALUE )
                __leave;
            hTag = CreateFile( GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
            if( hTag == INVALID_HANDLE_VALUE )
                __leave;        char c;
            while( ReadFile( hSrc, &c, 1, &dwReaded, NULL ))
            {
                if( dwReaded != 1 )
                    break;
                if( c == '\n' )
                {
                    ++ nCurLines;
                    if( bSaved )
                    {
                        c = '\r';
                        WriteFile( hTag, &c, 1, &dwReaded, NULL );
                        c = '\n';
                        WriteFile( hTag, &c, 1, &dwReaded, NULL );
                        if( nCurLines > nStartLine + nLines )
                        {
                            bSaved = FALSE;
                            __leave;
                        }
                    }
                    else
                    {
                        if( nCurLines == nStartLLine )
                            bSaved = TRUE;
                    }
                }
                else if( c == '\r' )
                   continue;
                else
                {
                    if( bSaved )
                        WriteFile( hTag, &c, 1, &dwReaded, NULL );
                }
            }
        }
        __finally
        {
            if( hTag != INVALID_HANDLE_VALUE )
                CloseHandle( hTag );
            if( hSrc != INVALID_HANDLE_VALUE )
                CloseHandle( hSrc );
        }
    }
      

  4.   

    以上代码只能读取ANSI编码的文件。未考虑UNICODE,或者UTF-8等其他编码的情况。如果要搞一个任何编码都通吃的,那就比较复杂了,去参考一下文本编码规则吧。还有,以上代码无论是UNIX还是Windows格式的回车换行(Windows的回车是\r\n,UNIX的是\n\r),都可以处理,并且输出会统一为Windows格式。