【问题标题】:Is modifying a file without writing a new file possible in c++? [duplicate]是否可以在 C++ 中修改文件而不编写新文件? [复制]
【发布时间】:2010-03-27 18:33:10
【问题描述】:

假设我有一个 100 行长的文本文件。我只想更改第 50 行中的内容。

一种方法是打开文件进行输入并打开一个新文件进行输出。使用for循环逐行读取文件的前半部分并逐行写入第二个文件,然后写入我要更改的内容,然后再次使用for循环写出后半部分。最后,我将新文件重命名以覆盖原文件。

除此之外还有其他方法吗?一种修改文件中间内容而不触及文件其余部分且无需再次写出所有内容的方法?

如果有,那么代码是什么?

【问题讨论】:

  • 停止一遍又一遍地问同一个问题,而是跟进你现有的问题
  • Ben Voigt 在您之前的问题中提供了答案,几乎相同的问题stackoverflow.com/questions/2530274/…
  • 只有在我多次澄清之后,他才能理解我的问题。我想如果我改写我的问题,人们会理解它并给我我需要的答案。
  • “只有在我多次澄清之后,他才能理解我的问题。” ::face palm::

标签: c++ file


【解决方案1】:

(复制自我对您上一个问题的评论)

嗯,这取决于您使用的 I/O 库、C 标准库、C++ 标准库或特定于操作系统的 API。但一般分为三个步骤。打开文件时,指定不截断的写入权限,例如fopen(fname,“r+”)。寻找所需的位置,例如寻找。用例如写新字符串fwrite 或 fprintf。在某些 API(如 Windows OVERLAPPED 或 linux aio)中,您可以说“写入此位置”而无需单独的查找步骤。

【讨论】:

    【解决方案2】:

    打开文件,使用fseek跳转到你需要的地方写入数据,然后关闭文件。

    来自http://www.cplusplus.com/reference/clibrary/cstdio/fseek/...

    #include <stdio.h>
    
    int main ()
    {
      FILE * pFile;
      pFile = fopen ( "example.txt" , "r+" );
      fputs ( "This is an apple." , pFile );
      fseek ( pFile , 9 , SEEK_SET );
      fputs ( " sam" , pFile );
      fclose ( pFile );
      return 0;
    }
    

    【讨论】:

    • fopen(fname, "w") 将删除文件的现有内容。
    • 糟糕,应该是“r+”而不是“w”
    • 没有 fseek 有没有办法做到这一点? fseek 不适用于 ofstream。用ofstream怎么做?
    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多