如何读取一个大文本文件中倒数N行或者指定行数的数据?

FirstPac 2003-05-05 03:10:22
有一个文本数据文件,很大,需要经常添加数据,还有可能修改末尾几行的数据。
我知道用 ReadString()可以读出一行文本数据,可是从文件头开始读取太花时间,1、如何能够直接读取倒数N行的数据呢?
2、如果不想把全部数据读入内存然后重新写入文件,如何改写末尾第N行的数据?
3、有没有高效率的办法可以指定读取第N行的数据?(不读入全部数据)

注、这个文件头几行如下:
19931203 1685 1687 1671 1674 50015 209412
19931206 1681 1697 1677 1692 92119 211951
19931207 1702 1711 1699 1700 92119 211951
19931209 1696 1696 1696 1696 58908 213731
19931210 1709 1741 1709 1740 73428 213220
19931213 1771 1772 1763 1768 122556 215613
19931214 1769 1769 1742 1745 103335 215456
19931215 1753 1756 1730 1738 69400 215547
19931216 1740 1746 1735 1743 69586 213383
19931217 1745 1758 1741 1754 69586 213383
19931220 1761 1772 1758 1771 73022 208436
19931221 1792 1808 1781 1799 58194 208381
19931222 1803 1808 1795 1800 58194 208381
19931223 1797 1799 1794 1795 43824 209260

请各位高手指点一二!
...全文
1168 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingcomRapeIsharp 2003-05-08
  • 打赏
  • 举报
回复
兄弟们!俺kingcom_xu又回来啦! 虽然俺以前帮过你们不少忙,可是这次你们一定要批评我,不要客气,我,我...我生了个私生子,叫21bird...
FirstPac 2003-05-07
  • 打赏
  • 举报
回复
To:lyzcom(初学者,什么都不懂)

因为文件很大,所以不想将文件一次载入啊

怎么没有人知道怎么结帖给分吗?
对了有没有人知道CSDN客户端哪里下载?
lyzcom 2003-05-07
  • 打赏
  • 举报
回复
只修改后面的或者指定的几行,不管修改是变长或者不是变长的都不难。
将文件一次载入,然后将修改段找出来,前后就分成了三段,将前一段先写入原文件,将中间段修改后写入,再将最后段写入文件。这样文件就被任意位置的修改了。

不过这方法比较原始,呵呵。但是有效,也最容易理解。
FirstPac 2003-05-07
  • 打赏
  • 举报
回复
怎么给分啊,我给分怎么不成功?
难道不是点管理后,在相应的帖子旁边加分吗?
FirstPac 2003-05-07
  • 打赏
  • 举报
回复
看来只有这样做了,我去试试!
感谢楼上各位的帮助!
特别感谢zhengstar() 、SENDFREE(大西瓜),你们给了我最大的帮助!
zhengstar 2003-05-07
  • 打赏
  • 举报
回复
to FirstPac():
你用modeReadWrite方式打开就行了,你可以每次先读固定个字节到内存中,然后查找换行符,一直到找到为止,此时得到的位置就是你要的行的开始位置然后调用seek方法,把文件指针移到你要的位置,然后就进行读写操作了.写的时候你从要修改的位置开始写,并计算文件的新的总长度,写完后,调用setlength方法把没用数据截掉.
另外,查找某行位置你可以从文件头开始查找,也可以从文件尾开始查找,当然前提是你知道总行数,如果你要找的行数靠近文件尾,就从后向前找,反之从前往后找
SENDFREE 2003-05-06
  • 打赏
  • 举报
回复
修改文件的指定字节,很低层的c函数:

bool patchfile(char *fname,long pos,unsigned char ch)
{
long hFile;

hFile=_open(fname,O_RDWR|O_BINARY);
if(hFile==-1) return false;

lseek(hFile,pos,0);
_write(hFile,&ch,1);
_close(hFile);
return true;

}
FirstPac 2003-05-05
  • 打赏
  • 举报
回复
To:SENDFREE(大西瓜)

谢谢你了!可是标准C的函数我都不会啊,我是半路出家的,只会C++和MFC的粗浅的东西。你有没有类似的例程,或者哪里能找到这样的例程?
FirstPac 2003-05-05
  • 打赏
  • 举报
回复
To:allenhai1980(学术人生。。。)
内存映射文件?怎么用啊,是不是很难?
唉,远水不解近渴。
dxhdxh2k 2003-05-05
  • 打赏
  • 举报
回复
我也面临同样的问题
在数据库里操作要相对容易的多了.
visualc6 2003-05-05
  • 打赏
  • 举报
回复
特别关注
herrycsdn 2003-05-05
  • 打赏
  • 举报
回复
用ReadFile
BOOL ReadFile(
HANDLE hFile, // handle of file to read
LPVOID lpBuffer, // pointer to buffer that receives data
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // pointer to number of bytes read
LPOVERLAPPED lpOverlapped // pointer to structure for data
);
你把hFile移到想读的地方,然后指点nNumberOfBytesToRead的大小,就行了
具体看msdn吧
simahao 2003-05-05
  • 打赏
  • 举报
回复
:(
zhengstar 2003-05-05
  • 打赏
  • 举报
回复
如果每行的数据定长,很容易,直接算位置,然后把文件指针直接移到该位置
如果变长,只有查找换行符了。改写文件中的某一行,不用全部把文件读入内存重写整个文件
只需重写从要改写的那一行以后的内容就行了
rebelwolf 2003-05-05
  • 打赏
  • 举报
回复
从文件最后读取部分数据,查找回车换行符,直到找到你的条件就行了
SENDFREE 2003-05-05
  • 打赏
  • 举报
回复
用标准C函数 _open 打开文件,
用_read读入文件最后4k数据(如果足够的话),
然后修改数据,再把数据用 _write 写回去。
这样只会对文件的最一部分进行操作,不会把文件全读进来。
allenhai1980 2003-05-05
  • 打赏
  • 举报
回复
用内存映射文件吧。
我试过对几M的文件操作,相比较其他的方式,此法速度最可观。
具体的参见《技术内幕》。
FirstPac 2003-05-05
  • 打赏
  • 举报
回复
To:shilong(星矢の诗龙)

如果能用数据库谁不用啊。
另建一个小文件当然可以了,可是软件要实时读取这个文件的。
而且大文件的最后几行数据是有可能要修改的!
晕!

郁闷!
shilong 2003-05-05
  • 打赏
  • 举报
回复
如果文件真的很大的话
建议用数据库吧...
-----------------------
如果只要处理最后十行的话
就干脆另外建个小文件就处理10行
每个星期把小文件加到大文件上面去
seacloud 2003-05-05
  • 打赏
  • 举报
回复
建议你去查查unix小程序tail的实现,他就可以实现显示文本文件后面
几行的。
加载更多回复(3)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧