以下是文本文件中的内容。
name1:1234
name2:2000
name3:3000
这是一个现有的文本文件,我想在文本文件中用另一个值(比如12345)替换一个值(比如说1234)。所以我将光标放在值的开头(这里是第7个位置)。然后我使用了以下声明:
fprintf中(文件指针, “12345 \ n”);
结果文件就像
name1:12345
ame2:2000
name3:3000
它覆盖4个字符(“1000”)和换行符('\ n')和'n',其中包含5个字符(“12345”)和换行符('\ n')。
我所知道的解决方案是:
1.覆盖整个文件以添加一个额外的字符
2.复制链接列表节点中的每一行并更改内存中的字符并写入同一文件
3.创建临时文件并将新字符复制到临时文件中的所需位置,并将临时文件的名称更改为源文件名并删除源文件。
此外,我尝试添加回车'\ r'和EOF的窗格式('\ r \ n'),仍然会覆盖下一行字符。我还使用[SetEndOfFile] [1] API扩展了文件大小,但我仍遇到同样的问题。我搜索了很多论坛,发现了“没有覆盖就插入字符”这样的答案。
是否有任何解决方案只是插入字符而不覆盖文件中间的字符。或任何在一行中插入字符而不影响下一行的逻辑 提前致谢。
是否可以使用visual studio VC ++ ??
感谢:)
答案 0 :(得分:1)
是否有任何解决方案只是插入字符而不覆盖 文件中间的字符。或任何插入的逻辑 一行中的字符,不会影响下一行。
不,我用过的任何文件系统都无法满足您的要求。
使用方法(3),临时文件。使用添加/替换了不同的唯一扩展名的临时文件,例如'.tmp',以便在启动时识别临时文件,然后:
1)获取源文件名,例如。 '的Source.txt'
2)追加或替换'.tmp'扩展名:'source.txt.tmp'
3)打开两个文件
4)阅读源代码,修改,写入临时文件
5)关闭两个
6)删除源文件
7)重命名临时文件
当您开始编程时:
1)搜索扩展名为“.tmp”的文件。
2)如果发现,例如。 'source.txt.tmp',取文件名并删除扩展名,例如'source.txt'
3)测试具有该名称的文件是否存在
4)如果是,请删除临时文件
5)如果没有,请重命名临时文件
结果:如果进程崩溃,您最终会得到一个完整的,未修改的源文件或一个完整的,已修改的源文件。
答案 1 :(得分:1)
顺序文件是......只是顺序。所有字节都是相互跟随的,没有线或任何其他结构的概念。
底层文件系统允许的唯一操作是(仅说写作):
中间没有插入的规定,所以没有语言可以做到这一点(除了在引擎盖下进行覆盖)
(*)如果你将文件的末尾向前移动多个逻辑块(文件系统意义),许多文件系统将创建一个空洞,它是一个幻像块,它不使用任何空间磁盘并被读取为空字节