繁体   English   中英

C++中的迭代器将向量写入二进制文件的正确方法

[英]The right way to write a vector to a binary file by iterator in C++

我已经搜索了很多此类问题,但没有得到满意的答案。

我正在研究 function 以使用 C++ 中的 ofstream::write 方法将向量容器写入二进制文件。

#include <vector>
#include <fstream>

typedef std::vector<unsigned char> byteArray;

byteArray data;
data.push_back('a');
data.push_back('b');
data.push_back('c');
data.push_back('d');

std::ofstream fout("out_file", std::ios::out | std::ios::trunc | std::ios::binary);

// I know the right way should be as following:
fout.write((char *)&data[0], data.size());

// But what I cannot understand is why the following expression is wrong, since gcc compiler says
// invalid cast from type ‘__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char> >’ to type ‘char*’

for(auto iter = data.begin(); iter != data.end(); iter++)
{
    fout.write((char *)iter, 1);
}

fout.close();

据我了解,迭代器 iter 是一个指针,它指向向量“数据”中的一个元素。 所以我认为(char *) iter会将底层数据类型重新解释为char,那么它应该满足fout.write的参数要求。 但实际上,情况并非如此。 我也很困惑,gcc 说 iter 是一种迭代器<unsigned char*, std::vector >,对吧? iter 不应该是 unsigned char * 类型吗?

我怎么了? 非常感谢您的帮助。

据我了解,迭代器 iter 是一个指针

它不是。 std::vector::iterator是未指定的类型。

您可以期望它具有一些类似指针的属性,但您不应假设它可能是什么特定类型。

由于您需要一个指针,请取消引用迭代器并获取该结果的地址。 那是一个指针。

fout.write((char *)&*iter, 1);

更好的是,使用 C++ 模型而不是难以跟踪的 C 模型。

fout.write( static_cast<char*>(&*iter), 1 );

更安全(Martin York 始终是一颗珍贵的宝石)——不要假设包含类型的大小。 未来可能会改变。 这种变化不会增加过度对冲。

fout.write( static_cast<char*>(&*iter), size_of(byteArray[0]) );

指针可以用作迭代器,但迭代器不必是指针。

通过提供取消引用operator*() 、递增operator++()等操作,迭代器的行为或多或少类似于指针,请参见LegacyInputIterator的要求

尽管具体定义会随着时间而改变,但请参阅std::input_or_output_iterator以了解 C++20 中的定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM