我要用 vc读取一个文件,该文件可以用记事本打开,里边的内容如下
236 17 15 15 2685 1564 145 1654
1654 46546 4654 4646 46546 16456 12 123
类似这种情况的排列,都是一些数据,我现在要读取最后一行的数据,并把各个数据拆分开来。同时要不影响文件的继续写入(另外一个程序在不停的刷新写入数据,我的目的就是读取最新的数据,同时获得文件的修改时间,精确到秒)。这个文件到最后有可能很大,因为一直在写入,请问各位大虾,如何操作,给个思路或者框架也行,我对mfc不熟,感觉无从下手,谢!
236 17 15 15 2685 1564 145 1654
1654 46546 4654 4646 46546 16456 12 123
类似这种情况的排列,都是一些数据,我现在要读取最后一行的数据,并把各个数据拆分开来。同时要不影响文件的继续写入(另外一个程序在不停的刷新写入数据,我的目的就是读取最新的数据,同时获得文件的修改时间,精确到秒)。这个文件到最后有可能很大,因为一直在写入,请问各位大虾,如何操作,给个思路或者框架也行,我对mfc不熟,感觉无从下手,谢!
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);
}
这个我一直用的,没问题
to:shunruo 我试试看,
while(NULL != _fgetts(buff, 256, stream) )
{
CString strtemp(buff);
if(strtemp == "\n")
continue;
// 在这里拆分数据,查一下CString的方法,找空格再分割,很简单的
str += strtemp;
}
这个地方,strtemp里边方的不是字符串么,可以直接与换行比较么?我需要最后一行的数据,现在str里好像是所有的数据啊,麻烦在解释一下,谢谢
读整行可以用fgets,读出来以后可用sscanf把数据一个个取出来,当然也可以直接fscanf读出来……
我这个是显示新内容,有时可能是好几行,
如果Lz的文件是一行更新一次就好办,调整定时器的时间保证新内容只有一行就行了,
只是第一次稍微处理一下就行了不要str += strtemp改为str = strtemp(加入第一次的判断)