RT
文本是用CFile创建的
怎样快速得到文本文件的总行数 
多谢高手说的详细点我自己有个想法是:
先把文本文件整个写到cstring中,然后数有几个_T(“\r\n”)来得到,但是又怎样快速得到_T(“\r\n”)的个数呢?注意:
不能用CStdioFile 的函数 多谢各位了

解决方案 »

  1.   


    CString str;
    int i=0,j=0;
    i = str.Find("\r\n",0);
    j++;
    while(i != -1)
    {
    i = str.Find("\r\n",i+2);
    j++;
    }最后j就是行数。
      

  2.   


    单独只获取行数是可以这么搞的,如果是想获取每一行的话,如下:#define MAX_BUF 64*1024
    void CTestDlg::AnalysisFile() 
    {
        char buf[MAX_BUF];
        ULONGLONG ullPos;
        ULONGLONG ullFileLen;
        int nBufPos;
        int nRead;    memset(buf, 0, sizeof(buf));
        ullPos = 0;
        nBufPos = 0;    CFile file;
        file.Open("c:\\001.txt", CFile::modeRead);
        ullFileLen = file.GetLength();    while((ullPos = file.GetPosition()) < ullFileLen)
        {
            nRead = file.Read(buf, MAX_BUF);    //读取的字节大小,一般情况下应该是MAX_BUF,文件结尾就不足MAX_BUF
            while(nRead > 0)
            {
                nBufPos = AnalysisBuffer(buf, nRead);
                if(MAX_BUF - nBufPos > 0)
                {
                    file.Seek(nBufPos - MAX_BUF, CFile::current);//看看到底是移动多少,细节
                }
            }        nBufPos = 0;    
        }
    }int CTestDlg::AnalysisBuffer(char*buffer, UINT nReadSize)
    {
        int nSubCount = 0;
        CString rString;
        CString rSubString;//用来接受子字符串,就是读取的一行
        rString = buffer;
        while(AfxExtractSubString(rSubString,rString.GetBuffer(0), nSubCount++,'\r\n'))
        {
            //....
            //rSubString就是循环读出每一行的;
        }    return rString.ReverseFind('\r\n');
    }
    粗略代码,细节需要调试
      

  3.   

        CString str;
        int i=0,j=0;
        i = str.Find("\r\n",0);
        j++;
        while(i != -1)
        {
            i = str.Find("\r\n",i+2);
            j++;
        }
    慢慢数啊
      

  4.   

    ifstream fin(strFileName);
    if (!fin.is_open())
    {
      ASSERT(FALSE);
    }
    std::string str;
    std::vector<std::string>arrLineContent;while (getline(fin, str))
    {
      arrLineContent.push_back(str);
    }int nLineCount = arrLineContent.size();
      

  5.   

    只关心文件的行数的话,只需要计算文件中的换行符(0x0a)。但是唯一的问题,如果文件最后一个字符不是换行符的话,总行数是需要加1的。
    一个函数解决问题。//函数入口参数是需要计数的文本文件名
    int CountLine(char * szFile)
    {
    int iRet;
    HFILE hFile;
    char cc;
    char cc0;//保存上一次读取的字节iRet = 0;
    hFile = _lopen(szFile,OF_READWRITE);
    if(hFile == HFILE_ERROR)
      return iRet;
    cc0 = 0;
    while(_lread(hFile,&cc,1) == 1)
    {
      if(cc==0x0a)
        iRet++;
      cc0 = cc;
    }
    _lclose(hFile);if((cc0!=0) && (cc0!=0x0a))
     iRet++;return iRet;
    }
      

  6.   

    1、一次性读入n个字节,大文件可能需要多次读入,n大小多少合适可以实际测试
    2、数 \n