【问题标题】:Updating a file with <fstream> library (overwriting just a specific section)使用 <fstream> 库更新文件(仅覆盖特定部分)
【发布时间】:2011-11-27 06:02:19
【问题描述】:

我想问是否有任何方法可以将内容为“ooooo”的文本文件更新为 “ooXXo”使用 fstream 库。我知道 cstdio 有一种方法,但我不想使用那种方法,因为不支持异常处理......另外,我不想将文件读入内存,更新我想要的部分,然后将所有内容写入一个干净的文件...基本上我正在寻找一种使用 fstream 的方法:

/* fseek example */
#include <stdio.h>

int main ()
{
  FILE * pFile;
  pFile = fopen ( "example.txt" , "w" );
  fputs ( "This is an apple." , pFile );
  fseek ( pFile , 9 , SEEK_SET );
  fputs ( " sam" , pFile );
  fclose ( pFile );
  return 0;
}

【问题讨论】:

    标签: c++ file fstream overwrite


    【解决方案1】:
    #include <fstream>
    
    int main()
    {
        std::ofstream os("example.txt");
        os<<"This is an apple.";
        os.seekp(9);
        os<<" sam";
        return 0;
    }
    

    【讨论】:

    • 您应该在直播中调用close。它会在os的析构函数中自动调用,但到时候如果有异常就会被吞掉。
    • @K-ballo:当然,这段代码中没有任何错误检查,但我只是按照原始示例进行操作。而且,无论如何,我不明白你的意思:除非你明确地为它启用异常,否则流对象本身不会抛出;而且,即使它确实如此(假设是来自内部缓冲区的std::bad_alloc),在此示例代码中没有try 块,所以即使我调用close(),异常也会未经处理并导致terminate()被调用(无论如何都会在这里发生)......还是我错过了其他东西?
    • 不,只是觉得值得一提的是,还有一个等价于 fclose 的东西,它并不总是意味着让析构函数为你做这件事。
    • 嗯,好吧,虽然通常我更喜欢避免使用close,而是将文件流对象的范围限制在需要它们存在的代码部分(有点像using 语句在 C# 中)。
    • 此外,由于根本没有 try-catch 块,因此无法保证会调用 terminate()
    【解决方案2】:
    #include <fstream>
    
    int main (){
      std::fstream pFile("example.txt");
      pFile << "This is an apple.";
      pFile.seekp(9);
      pFile << "sam";
      pFile.close();
      return 0;
    }
    

    fstream 默认打开文件进行读写。构造函数中有第二个参数具有默认值,用于控制该行为。

    【讨论】:

    • 一般来说,如果您只需要读取或写入权限,您可以(应该)使用ifstream/ofstream 使其更加清晰。
    • 是的,但是您将无法更新已经存在的文件,我认为这是 01d55 的重点...如果您使用 ios::out 标志以 ofstream 或 fstream 形式打开文件将清除文件内的所有现有内容,以更新您需要 fstream 而不需要 ios::out 的文件。感谢您的回复;)
    • 实际上你需要两个标志,比如: ios::in|ios::out 如果你还设置了二进制标志...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2023-03-11
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多