用CStdioFile file;file.Open(....);
文件打开后,然后用
         CString sData;
         int hangNum=0;
//先判断共有多少行数据,似乎这样不好:(
while(fileout.ReadString(sData))
{
hangNum++;

}
  //........   接着下面操作!
    file.SeekToBegin()
        int hang =0;
        m_progressCtrl.SetRange(0,hangNum-1);
while(fileout.ReadString(sData))
{
                 //上面想知道有多少行是为了下面进度条可以运作
            m_progressCtrl.SetPos(hang);
hang++;
               //......  
              然后是对sData数据处理的过程....
         }如此方法好像很落后.有没有好些的方法,为了进度条可以运作,先ReadString
一次,好像太落后了!

解决方案 »

  1.   

    根据msdn用法修改.BOOL ParseALargeFile(HWND hwndParent, LPSTR lpszFileName) 

        RECT rcClient;
        int cyVScroll;
        HWND hwndPB; 
        HANDLE hFile;
        DWORD dwlen,dwnum=48;
        LPCH pch;
        LPCH pchTmp;
     
        InitCommonControls(); 
        GetClientRect(hwndParent, &rcClient); 
        cyVScroll = GetSystemMetrics(SM_CYVSCROLL); 
        hwndPB = CreateWindowEx(0, PROGRESS_CLASS, (LPSTR) NULL, WS_CHILD | WS_VISIBLE, 
    rcClient.left, rcClient.bottom/2, rcClient.right, cyVScroll, 
            hwndParent, (HMENU) 0, hInst, NULL); 
     
        hFile = CreateFile(lpszFileName, GENERIC_READ, FILE_SHARE_READ, 
            (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, 
            FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); 
     
        if (hFile == (HANDLE) INVALID_HANDLE_VALUE) 
            return FALSE; 
     
        dwlen = GetFileSize(hFile, (LPDWORD) NULL); 
     
        SendMessage(hwndPB, PBM_SETRANGE, 0, MAKELPARAM(0, dwlen / dwnum)); 
        SendMessage(hwndPB, PBM_SETSTEP, (WPARAM) 1, 0); 
     
        pch = (LPCH) LocalAlloc(LPTR, sizeof(char) * dwnum); 
        pchTmp = pch; 
        do { 
            ReadFile(hFile, pchTmp, sizeof(char) * dwnum, &dwlen, 
                (LPOVERLAPPED) NULL); 
            
            SendMessage(hwndPB, PBM_STEPIT, 0, 0); 
        } while (dwlen); 
        CloseHandle((HANDLE) hFile); 
     
        DestroyWindow(hwndPB); 
        return TRUE; 
    }
      

  2.   

    m_pFile.open(aFileName,ios::in|ios::nocreate);
    int lines=0;
    while(!m_pFile.eof())
    {
    m_pFile.ignore(MAX_LINE_LEN,'\n');
    lines++;
    }
    m_pFile.clear();
    m_pFile.seekg(0,ios::beg);
      

  3.   

    bluesky137(蓝色的天空) ,用你的方法判断似乎也很慢哦(我文件大概140万行左右)
      

  4.   

    同意自己记录行数的建议。自己计算必须使用搜索只是搜索起来比较麻烦,效率不会太高。有改进办法,不知道是否奏效(只是建议),开合适的缓冲,但不要太小。在内存中搜索,而不用总是去取一个字节,几十个字节的小数据量。(4K,8K,32K)?
      

  5.   

    while(fscan())
    {
     n++;
    }
      

  6.   

    如果只是给进度条用,大可不必这么精确
    比如说你可以在开始根据文件的大小设定一个最大值
    然后分析一行proress.pos++。最后完了的时候再把它加到顶
    个人认为:用户看到进度条的目的是确认程序没有死掉
      

  7.   

    我教你一个不用知道具体行数的办法m_progressCtrl.SetRange(0, 100);
    m_progressCtrl.SetPos(0);CStdioFile file(_T("C:\\Test.txt"), CFile::modeRead);// 这里用于取得文件的大小
    CFileStatus fs;
    file.GetStatus(fs);CString strData;
    while (file.ReadString(strData))
    {
    // 计算ProgressCtrl的进度
    int nFilePos = file.GetPosition();
    int nProgressCtrlPos = int(float(nFilePos) / fs.m_size * 100 + 0.5);
    m_progressCtrl.SetPos(nProgressCtrlPos); // 处理strData
    }
      

  8.   

    谢谢楼上的各位兄弟,尤其是waterflier(水行鸟),Earthdog(Earthdog) 等各位兄弟,我现在结贴!