c++ - 读写同一个文件c++

标签 c++ fstream

我有一个小应用程序,它在开始时会读取文本文件(带有序列化对象),其中我存储了一些对象(我通过重载 << 和 >> 运算符来实现)。每次创建新对象时都必须更新此文本文件:

fstream m_haystackMapFile;
m_haystackMapfile.open(haystackMapFile,  std::ios::binary | std::ios::in | std::ios::out);

首先我会阅读:

WHaystackFile f;
m_haystackMapfile.seekg(0, std::ios::beg);

std::copy(std::istream_iterator<WHaystackFile>(m_haystackMapfile), std::istream_iterator<WHaystackFile>(), std::back_inserter(m_haystackFiles));

std::cout << "reading input file, no of files: " << m_haystackFiles.size() << std::endl;
for(std::vector<WHaystackFile>::iterator it = m_haystackFiles.begin(); it != m_haystackFiles.end(); ++it){
    f = *it;
    std::cout << "key: " << f.getKey() << " cookie: " << f.getCookie()  << " path: " << f.getPath()  << " size: " << f.getSize()<< std::endl;
}

然后在创建新对象后我写:

void WhaystackMap::addEntry(WHaystackFile &f){
    std::cout << "adding entry to index file" << std::endl;
    m_haystackMapfile.seekp(std::ios::end);
    m_haystackMapfile << f;
    std::cout << f;

}

不幸的是,我想写入的文件永远不会更新,并且它的大小始终为 0。也许我搞砸了一些东西,但是在谷歌搜索之后我找不到答案如何使用 fstream 我可以读取和写入同一个文件.. .

欢迎任何帮助:)

问候 J.

最佳答案

检查 I/O 操作是否成功非常重要。例如,如果 seekp 无法搜索到所需的位置,它将设置 failbit,然后所有后续写入都将失败。或者,正如@Christophe 指出的那样,如果您将文件读到最后,您将导致 eofbit 被设置。除非清除该位,否则下一个 I/O 操作(甚至 seekp)都将失败。

即使 eofbit 已被重置,搜索也可能会失败,因为调用应该是 m_haystackMapfile.seekp(0, std::ios::end);

关于c++ - 读写同一个文件c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29905375/

相关文章:

写入输出文件的 C++ 星形菱形图案变得困惑

c++ - 从文件写入和读取数据时丢失数据(随机访问文件,C++)

c++ - 即使输入文件不存在,输出文件也会继续创建? ****编辑****

c++ - 在不知道名称的情况下打开文件

c++ - 在 windows 下对 Unix 下创建的文件使用 fstream::seekg

c++ - 前向声明包括,在声明之上包括(ClassFwd.h + Class.h)

c++ - 更改数组的最后 5 个字符

c++ - 使用 static_cast<Base>(*this) 初始化可变参数 CRTP...: is it legal ?

c++ - 为什么 g++5 在自动类型推导中推导对象而不是 initializer_list

java - 用c++编写的电话应用程序