今天我正在更换一个低级别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是否提供某种保证?
答案 0 :(得分:3)
ostreambuf_iterator
是输出迭代器,std::distance
需要输入迭代器。
这个错误可能有点神秘,但这是因为difference_type
typedef
被void
加到ostreambuf_iterator
,即试图测量两个{{1}}之间的距离没有意义,他们甚至无法相互比较。