ostreambuf_iterator <char>的difference_type是无效的吗?</char>

时间:2014-10-22 08:44:44

标签: c++ typetraits

今天我正在更换一个低级别C-Stylish方法,该方法可以为文件保存缓冲区。整件事看起来像这样:

bool Profile::save(const char* path)
{    
    FILE* pFile = fopen(path, "w");
    BOOST_SCOPE_EXIT((pFile)) {
        fclose(pFile);
        pFile=NULL;
    } BOOST_SCOPE_EXIT_END

    if(pFile == 0)
    {
        LOG_ERROR("could not open profile");
        return false;
    }

    size_t nWriteSize = fwrite(DataBlock, 1, sizeof(DataBlock), pFile);
    if(nWriteSize != sizeof(DataBlock))
    {
        LOG_ERROR("Only " << nWriteSize << " of " << sizeof(DataBlock) << "bytes written");
        return false;
    }

    return true;
}

这个方法实际上包含一个错误,如果它找不到要打开的文件就会发生segvfault(在BOOST_SCOPE_EXIT内我们忽略了检查pFile!= NULL)。所以我认为我用更惯用的C ++方式重写整个事物。这就是我想出的:

bool Profile::save(const char* path)
{    
    std::ofstream profile(path, std::ios::out | std::ios::binary);

    if(!profile)
    {
        LOG_ERROR("could not open " << path);
        return false;
     }

    const char* pBeginOfBlock = reinterpret_cast<char*>(DataBlock);
    const char* pEndOfBlock   = reinterpret_cast<char*>(DataBlock + sizeof(DataBlock));


    std::ostreambuf_iterator<char> begin_file = std::ostreambuf_iterator<char>(profile);
    std::ostreambuf_iterator<char> end_file = std::copy(pBeginOfBlock,
                                                        pEndOfBlock,
                                                        begin_file);

    const unsigned int BytesWritten = std::distance(begin_file, end_file);
    if(BytesWritten != sizeof(DataBlock))
    {
        LOG_ERROR("Only " << BytesWritten << " of " << sizeof(DataBlock) << "bytes written");
        return false;
    }

    return true;
}

然而,这并没有编译。它给我一个错误,我试图获得ostreambuf_iterators的距离:

  

错误:无法忽略void值,因为它应该是

显然,difference_type ostreambuf_iterator是无效的。如何检查所有字节是否已实际写入文件?检查是否必要或std :: copy是否提供某种保证?

1 个答案:

答案 0 :(得分:3)

ostreambuf_iterator是输出迭代器,std::distance需要输入迭代器。

这个错误可能有点神秘,但这是因为difference_type typedefvoid加到ostreambuf_iterator,即试图测量两个{{1}}之间的距离没有意义,他们甚至无法相互比较。