vs2010 MFC 求处理txt文本文件的后1000个字符的代码。

我这里有一个软件会产生txt格式的记录文件,大小几兆的样子,十几万行,每行100左右个字符。
这个记录文件的内容是随时变化的。
我想在ontimer响应函数(不要回调)内用cstudiofile每隔1秒钟读一次这个txt文件。
并取文件的末尾**大约**50行放到cstringarray内,然后处理。
为了尽量在1秒内提取+处理完,请给出尽可能高效的**提取代码**,
最好能加入:预防某次的提取+处理超过1秒的情况,
因为我感觉超过1秒,本次处理会被下次ontime函数强制中断。谢谢。

我想先定位到文件末尾,取文件末尾位置。然后从末尾-5000的位置开始readstring,舍掉第一次readstring可能读到的半行。是否可行?

c++

3个回答

抱歉了,我要的是代码,大家都没有给出代码,分收回了。

可以用fseek移动函数指针,找到距离文件结束-多少个字节 的地方。至于这个多少个字节,因为1000个字符,如果不是纯英文的,换算成字节会比较困难,所以可以考虑多读取一些,比如你的文字编码是gb2312,那么读取2000个字节足够。
如果是utf8,可以读取4000个字节。读取以后装入CString,再用 Right 函数取即可。
但是如果只有几MB,一次性全部读取到CString再substr实际上也不会超过1s。现在硬盘的读取速度在200MB/s以上,固态硬盘在500MB/s以上,内存CPU的处理速度再快很多倍。

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 有空帮你写一个
10 个月之前 回复
lnhv013710
lnhv013710 回复贵阳挖掘机马善福,自备车辆专业挖游泳池: 1000个字符可能会刚好读出来50行(50个array成员),或者50.5行(51个array成员,删掉成员0),或者49.5行(50个array成员,删掉成员0),所以不管半行不半行的,全部都删掉array[0]
10 个月之前 回复
lnhv013710
lnhv013710 回复贵阳挖掘机马善福,自备车辆专业挖游泳池: 能否提供这个过程的代码哦,谢谢
10 个月之前 回复
lnhv013710
lnhv013710 回复贵阳挖掘机马善福,自备车辆专业挖游泳池: 那我旧试着移动指针到文件尾,然后减去1000字符,从-1000开始readstring存到cstringarray,然后在去掉末尾的可能是半行的成员。
10 个月之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复lnhv013710: 不一样,移动文件指针效果高很多
10 个月之前 回复
lnhv013710
lnhv013710 用Cstudiofile的readstring 一行一行的读出来的效率和直接定位到-5000再readstring一行一行的读,这个两个效率是不是一样的?我的一个朋友说,定位到文件的末尾相当于整个文件都读一遍了,还不如直接一行一行的读
10 个月之前 回复

对于这个,如果换个方案思路呢,不是直接读取呢
开启一个线程,维护一个50大小的列表,每次写入时,都往线程里也传入,超了将头部踢掉,尾部插入最新的,这样每1s都读这个缓存 应该快很多。

当需要读取行数变化, 只需调整这个列表大小即可,方便维护,而且性能也容易跟得上。

lnhv013710
lnhv013710 不行的,那个程序改不了,我只能读那个程序生成的txt文件,这个文件是程序运行的记录文件。然后根据这个文件的内容判断当前程序的运行状态,没有办法啊
10 个月之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 如果能修改生成数据的程序,直接用pipe更简单了。
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐