我要用 vc读取一个文件,该文件可以用记事本打开,里边的内容如下
236   17     15    15   2685  1564  145  1654
1654  46546  4654 4646  46546 16456 12   123
类似这种情况的排列,都是一些数据,我现在要读取最后一行的数据,并把各个数据拆分开来。同时要不影响文件的继续写入(另外一个程序在不停的刷新写入数据,我的目的就是读取最新的数据,同时获得文件的修改时间,精确到秒)。这个文件到最后有可能很大,因为一直在写入,请问各位大虾,如何操作,给个思路或者框架也行,我对mfc不熟,感觉无从下手,谢!

解决方案 »

  1.   

    下面的代码自己小改一下就行了#include <share.h>
    void CTest0Dlg::OnTimer(UINT nIDEvent) 
    {
    static BOOL bBusy = FALSE;
    static DWORD dwPos = 0;
    TCHAR buff[256];
    static CString str;
    //—** 在这里自己用GetFileAttributesEx取得修改时间
    if(nIDEvent == TIMER_CHECK_NEW)
    {
    if(bBusy) return;
    ZeroMemory(buff, 256);
    bBusy = TRUE;
    FILE *stream;
    if( (stream = _fsopen( "g:\\1.txt", "r", _SH_DENYNO )) != NULL )
    {
    if(dwPos > 0)
    {
    if(fseek(stream, dwPos, SEEK_SET))
    {
    MessageBox("fseek error");
    fclose( stream );
    bBusy = FALSE;
    }
    }
    else
    {
    if(fseek(stream, 0, SEEK_SET))
    {
    MessageBox("fseek error");
    fclose( stream );
    bBusy = FALSE;
    }
    }

    CString str0;
    m_edit1.GetWindowText(str0);
    while(NULL != _fgetts(buff, 256, stream) )
    {
    CString strtemp(buff);
    if(strtemp == "\n")
    continue;
    // 在这里拆分数据,查一下CString的方法,找空格再分割,很简单的
                                         str += strtemp;
    }

    dwPos = ftell(stream);
    if(str0 != str)
    m_edit1.SetWindowText(str);
    } fclose( stream );
    bBusy = FALSE;
    // KillTimer(TIMER_CHECK_NEW);
    }
    CDialog::OnTimer(nIDEvent);
    }
    这个我一直用的,没问题
      

  2.   

    这东西用标准库去读写就可以了,不用MFC
      

  3.   

    谢谢各位,
    to:shunruo  我试试看,
    while(NULL != _fgetts(buff, 256, stream) )
                {
                    CString strtemp(buff);
                    if(strtemp == "\n")
                        continue;
                    // 在这里拆分数据,查一下CString的方法,找空格再分割,很简单的
                                         str += strtemp;
                }
    这个地方,strtemp里边方的不是字符串么,可以直接与换行比较么?我需要最后一行的数据,现在str里好像是所有的数据啊,麻烦在解释一下,谢谢
      

  4.   

    LZ的设计很糟糕,首先要必须保证读写能够同步起来,如果可以保证这一点,那么在上次读取完数据的时候,可以记录读取结束的位置,下次fseek一下直接搞定。
    读整行可以用fgets,读出来以后可用sscanf把数据一个个取出来,当然也可以直接fscanf读出来……
      

  5.   

    回7楼,if(strtemp == "\n") 是为了避免显示时重复换行
    我这个是显示新内容,有时可能是好几行,
    如果Lz的文件是一行更新一次就好办,调整定时器的时间保证新内容只有一行就行了,
    只是第一次稍微处理一下就行了不要str += strtemp改为str = strtemp(加入第一次的判断)