将向量的后半部分写入std :: ofstream

时间:2015-08-11 10:49:55

标签: c++ vector rotation fstream ofstream

我正在编写代码来编写vector到文件。我的目标是首先将vector的后半部分写入文件,然后根据偏移量编写前半部分。下面的代码给我分段错误。

std::vector<uint8_t> buffer_(1000); // the vector is filled with values
int offset_ = 300;
std::ofstream output_file (file_name.c_str(), std::ofstream::out | std::ofstream::binary);
if (output_file.is_open()) {
    output_file.write(reinterpret_cast<const char*>(&buffer_[offset_]), (buffer_.size() -offset_)*sizeof(uint8_t));
    // segmentation fault on the line above
    output_file.write(reinterpret_cast<const char*>(&buffer_[0]), (offset_)*sizeof(uint8_t));
}

有人可以告诉我代码有什么问题吗?

2 个答案:

答案 0 :(得分:4)

首先将偏移量视为[0-based]数组索引(&buffer_[300]),然后立即将其视为[1-based]元素计数(buffer_.size()-300)。这将导致从301 st 元素开始读取700个元素,该元素超过向量的末尾一个元素。

从任一参数中减去一个,取决于你的实际意思是“偏移”。

当你遇到问题时,你应该习惯于在纸上计算出这些基本数学 使用你的调试器也不会受到伤害!

答案 1 :(得分:0)

此问题所寻求的功能已在rotaterotate_copy中实施。作为一般规则,在标准中已经重新实施的行为是浪费的和/或可能充满错误,正如这个问题所证明的那样。

由于 ga('create', 'UX-xxxxxxx-x', 'auto'); ga('set', { page: '/index.html?FaqPage', title: 'Faq'}, { page: '/index.html?MemberPage', title: 'Member'}); ga('send', 'pageview'); 仅对其输入迭代器使用ForwardIterator,因此可以通过简单使用this answer来利用ostreambuf_iterator。所以这可以完成,而不是问题中的两个写:

rotate_copy