使用C / C ++

时间:2016-05-19 10:23:51

标签: c++ c file text

以下是文本文件中的内容。

  

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 ++ ??
感谢:)

2 个答案:

答案 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)

顺序文件是......只是顺序。所有字节都是相互跟随的,没有线或任何其他结构的概念。

底层文件系统允许的唯一操作是(仅说写作):

  • 在文件
  • 中的任意位置替换字节
  • 在文件
  • 的末尾添加字节
  • 截断文件(或通过移动文件末尾
  • 在末尾添加随机(*)字节)

中间没有插入的规定,所以没有语言可以做到这一点(除了在引擎盖下进行覆盖)

(*)如果你将文件的末尾向前移动多个逻辑块(文件系统意义),许多文件系统将创建一个空洞,它是一个幻像块,它不使用任何空间磁盘并被读取为空字节