大牛们,请问如何用windows API实现对文本文件的字符删除修改?

大牛们,请问如何用windows API实现对文本文件的字符删除修改?

问题描述:

RT
想请问大家,想要删除指定的几个字符如何做到。我用WriteFile写入的\b会出现乱码,可以这样做么?

一些基本常识,文件在计算机里是怎么存的,似乎你不太清楚,我们用最简单的方式来说(真实的文件系统比这个复杂,但是你可以这么理解)
我们在磁盘上划分为两个部分,前面是文件分配表,记录文件名、文件长度、起始地址。
文件则位于磁盘后面,从起始地址到(起始地址+文件长度)
要想追加,直接在起始位置+文件长度的地址继续写下去就可以了。
要想截短,直接改变文件长度
但是要想在中间插入、删除,就没有直接的办法了。

用ultraedit打开看下你写后的文件,注意两个问题
一个是你写入的位置是否正确,一个是你的编码是否和原来的一致。
另外,你只能改写文件,无论什么办法,如果你想从文件的中间删除字符,那么都是做不到的,只能将后面的文本再复制一遍,追加在删除的位置上。

打开文件的时候用二进制方式,然后注意写入长度等。

我以为插入\b退格符能删除前面一个字符的。。。结果按你说的用Ultraedit打开发现0D 0A 后又跟了一个08。。
难道真的只能把后面的文本复制一遍么?

这是显而易见的。因为文件是连续存储在磁盘中的,而不是用的链表或者什么别的结构(文件系统使用簇,簇和簇之间可以不连续,但是一个簇内必须是连续的,NTFS上一个簇是4KB)

这个很好理解,对于文件,要想把它截短,是很容易的。你直接把第三行接在后面写,写完以后设置下文件长度,就等于删除了。

API函数中SetFilePointer SetEndOfFile就能办到。
当然,这是告诉你原理,实际上没必要那么计较这点性能,最好的办法还是读取到内存中,在内存中编辑字符串,一次性写回文件。