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

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

7个回答

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

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

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

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

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

yzt33
猫和鱼爪 恩,用CreateFile打开的文件,应该不区分吧。
接近 5 年之前 回复

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

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

yzt33
猫和鱼爪 可是我还是不明白如何删除: 如果我要删除第二行的字符,那么就把第三行和后面的数据都从第二行开始写入,可是最后不是还是会多出来一行么?那一行如何删除?
接近 5 年之前 回复
yzt33
猫和鱼爪 可是我还是不明白如何删除:
接近 5 年之前 回复
yzt33
猫和鱼爪 可是我还是不明白如何删除:
接近 5 年之前 回复

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

yzt33
猫和鱼爪 啊!原来如此!哈哈,谢谢大牛。
接近 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问