读取和写入相同的文件c ++

时间:2015-04-27 20:30:26

标签: c++ fstream

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

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我可以读取和写入相同的文件..

欢迎任何帮助:)

问候 学家

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

问题是seekp()错误使用:

  • 您在ios::end
  • 中使用一个参数m_haystackMapfile.seekp(std::ios::end)
  • 但单个参数仅适用于绝对定位。所以ios::end被转换为一个整数,并将你定位在一个意想不到的地方(在我的实现它是2)。
  • 您必须使用m_haystackMapfile.seekp(0, std::ios::end)代替

还有一个问题:您在istream_iterator<>()中使用的std::copy()将会读取该流,直到它结束。因此将设置failbit和eofbit。

因此,在清除标志之前,不会进行任何流操作:m_haystackMapfile.clear();