问一个MFC操作文件的有关问题
问一个MFC操作文件的问题
对一个文件每次读取一行:
while (m_read.GetPosition() < m_read.GetLength())
{
m_read.ReadString(string);
if (string == "")
{
break;
}
if(string.Find("Err") != -1)
{
m_tmpfile.SeekToEnd();
m_tmpfile.WriteString(string);
m_tmpfile.WriteString("\n");
}
}
m_read 和m_tmpfile都是CStdioFile对象,现在的问题是,我使用m_read.ReadString读取一行时遇到一个问题,比如我要读取下面的文件:
0710 183623.636 Err 1104914752 SendSmsService-4096 >> SmsMessage.cpp:2907 virtual int SMPP::CSmppMessage::processWaitRespTimeOut(SMPP::CSmsTimeOut*)() >> [0x00002aaab9f02c40]Wait submit resp time out,simulate SR and erase this message from wait resp map.
destDOID = DOID://00000001/00000001/0000003D/0000003D
requestID = 6156
0710 183646.979 Inf 1077573952 DetectService-22 >> no more records
0710 183754.297 Inf 1096493376 Container >> Set timer successfully. timerID=2360198336, userTimerID=85, interval=3000, times=1, moduleID=12, MHID=12.
第一次读取能够读到SMPP::CSmppMessage::processWaitRespTimeOut(SMPP::CSmsTimeOut*)() >> [0x00002aaab9f02c40]Wait submit resp time out,simulate SR and erase this message from wait resp map.但是第二次以后的读取都只能读到"map.",程序陷入死循环了,请教下这个是啥原因啊?
还有个问题:如果文件的最后一行存在空行,GetPosition返回的值永远会小于GetLength返回的值,程序也跳不出来,有没有哪个命令能够删除文件中的空行?或者能够解决这个问题的?谢谢啦!
------解决方案--------------------
------解决方案--------------------
ReadString读到最后会返回
------解决方案--------------------
看 MSDN 上的 CStdioFile::ReadString 的说明
--------------------------------------------
Return Value
A pointer to the buffer containing the text data. NULL if end-of-file was reached without reading any data; or if boolean, FALSE if end-of-file was reached without reading any data.
空行他也包含了 “回车换行” 字符,并非正真意义上的空, 所以ReadString也返回TRUE,下面的string.Find会返回-1,不影响任何逻辑关系。 所以答案就是行。
对一个文件每次读取一行:
while (m_read.GetPosition() < m_read.GetLength())
{
m_read.ReadString(string);
if (string == "")
{
break;
}
if(string.Find("Err") != -1)
{
m_tmpfile.SeekToEnd();
m_tmpfile.WriteString(string);
m_tmpfile.WriteString("\n");
}
}
m_read 和m_tmpfile都是CStdioFile对象,现在的问题是,我使用m_read.ReadString读取一行时遇到一个问题,比如我要读取下面的文件:
0710 183623.636 Err 1104914752 SendSmsService-4096 >> SmsMessage.cpp:2907 virtual int SMPP::CSmppMessage::processWaitRespTimeOut(SMPP::CSmsTimeOut*)() >> [0x00002aaab9f02c40]Wait submit resp time out,simulate SR and erase this message from wait resp map.
destDOID = DOID://00000001/00000001/0000003D/0000003D
requestID = 6156
0710 183646.979 Inf 1077573952 DetectService-22 >> no more records
0710 183754.297 Inf 1096493376 Container >> Set timer successfully. timerID=2360198336, userTimerID=85, interval=3000, times=1, moduleID=12, MHID=12.
第一次读取能够读到SMPP::CSmppMessage::processWaitRespTimeOut(SMPP::CSmsTimeOut*)() >> [0x00002aaab9f02c40]Wait submit resp time out,simulate SR and erase this message from wait resp map.但是第二次以后的读取都只能读到"map.",程序陷入死循环了,请教下这个是啥原因啊?
还有个问题:如果文件的最后一行存在空行,GetPosition返回的值永远会小于GetLength返回的值,程序也跳不出来,有没有哪个命令能够删除文件中的空行?或者能够解决这个问题的?谢谢啦!
------解决方案--------------------
while(m_read.ReadString(string))
{
if(string.Find("Err") != -1)
{
m_tmpfile.SeekToEnd();
m_tmpfile.WriteString(string);
m_tmpfile.WriteString("\n");
}
}
------解决方案--------------------
ReadString读到最后会返回
------解决方案--------------------
看 MSDN 上的 CStdioFile::ReadString 的说明
--------------------------------------------
Return Value
A pointer to the buffer containing the text data. NULL if end-of-file was reached without reading any data; or if boolean, FALSE if end-of-file was reached without reading any data.
空行他也包含了 “回车换行” 字符,并非正真意义上的空, 所以ReadString也返回TRUE,下面的string.Find会返回-1,不影响任何逻辑关系。 所以答案就是行。