【问题标题】:С++ read/write fileС++ 读/写文件
【发布时间】:2021-04-12 14:34:52
【问题描述】:

使用 C++、gcc.9x、Linux。我尝试打开并读取文件,然后保持打开状态以进行进一步操作 - 为每次迭代重写它。 但是每次,在我执行open 这个文件之后 - 它都会被清除。 是否可以保留文件内容直到我重写它? 而且我想一直打开文件以进行写入。

constructor()
{
    {
        ifstream tmp("file.db");
        int date;
        tmp >> date;
    }

    // it gets wiped out here, but I don't want it. 
    // And I want to keep ofstream opened all the time.
    fileStreamMember_.open("file.db");  // std::ofstream
}


writeMethod()
{
    fileStreamMember_.seekp(0, ios::beg);
    fileStreamMember_<< date_ << endl;
}

【问题讨论】:

  • 这能回答你的问题吗? How to append text to a text file in C++?
  • 几乎完美的复制品:stackoverflow.com/q/39256916/103167
  • 谢谢,它解释了我的问题。我每次都需要覆盖文件内容。但它应该存在,直到我重写它......我试图组合不同的标志 - 但它对我不起作用。它要么截断文件,要么附加到文件的末尾..
  • @AlexandrDerkach:唯一可以让您重写现有内容中任意位置的方法是in | out。从您的角度来看,您不是在读取现有内容,但从操作系统的角度来看,如果您只想更改块内的几个字节,则操作系统必须读取块,更改这些字节,并将整个修改后的块发送回磁盘。

标签: c++ file stream


【解决方案1】:

1-st:文件对象有状态。每次操作后都会更新状态。 您可以使用如下代码:

if (!fileStreamMember_) {
  // There is an error after operation
}

您可以/应该在操作期间检查文件对象的状态。

2-nd:您应该关闭文件对象(或销毁它)以写入所有更改。

【讨论】:

  • 我打开文件以在范围内读取 - 它在 open 调用之前关闭。检查!fileStreamMember_ 无济于事。我只想在打开文件后保留文件内容,直到我重写它。
  • Alexander,你应该在文件打开时使用正确的选项。例如,试试这个:open("file.db", std::ios_base::out | std::ios_base::binary | std::ios_base::app);
【解决方案2】:

std::ofstream open() 函数(和构造函数)具有trunc 的默认标志。您应该明确指定 flags/mode 参数或改用std::fstream

【讨论】:

  • 谢谢,现在我明白为什么它被截断了。我尝试使用带有out 标志集的fstream,但它也会截断文件...
猜你喜欢
  • 2021-07-24
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 2013-05-21
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多