如何将vector <unsigned char>写入file,后跟unsigned int

Jam*_*ame 8 c++ file visual-studio-2013

我必须分组5个unsigned char向量(data_length=5).在组的末尾,我想添加一个ID组并将它们(组数据+其ID)写入文件.在哪种组ID类型integer.我按照以下代码执行该任务.这是对的吗?吼叫图显示了我正在采取的措施

在此输入图像描述

#define random(x) (rand()%x)
std::ofstream filewrite("abc.raw", std::ios::out | std::ofstream::binary);
unsigned int iter = 0;
unsigned int data_length=5;
unsigned int ID_data=0;
//-------------Write data-------------//
while (iter<10){
    vector<unsigned char> vec_data;
    for (unsigned int i=0;i<data_length;i++){
        vec_data.push_back(random(256))
    }           
    std::copy(vec_data.begin(), vec_data.end(), std::ostreambuf_iterator<char>(filewrite));
    //Write ID_data after vec_data
    filewrite.write(reinterpret_cast<const char *>(&ID_data), sizeof(ID_data));
    ID_data++;
    iter++;
}
filewrite.close();
Run Code Online (Sandbox Code Playgroud)

另外,我想在没有组ID的情况下将数据提取到vector.这是我从上述文件中提取数据的代码,但它不会删除ID组.你能帮我把它删除吗?

//-------------Read data-------------//
std::ifstream file("abc.raw", std::ios::binary);
// Stop eating new lines in binary mode!!!
file.unsetf(std::ios::skipws);

// get its size:
std::streampos fileSize;

file.seekg(0, std::ios::end);
fileSize = file.tellg();
file.seekg(0, std::ios::beg);

// reserve capacity
std::vector<unsigned char> vec;
     vec.insert(vec.begin(),
std::istream_iterator<unsigned char>(file),
std::istream_iterator<unsigned char>());
Run Code Online (Sandbox Code Playgroud)

cdo*_*nat 2

首先,您使用while, wherefor会更容易阅读。顺便提一句。您不需要两个迭代变量。迭代一下就好了ID_data

for( unsigned int ID_data = 0; ID_data < 10; ++ID_data ) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

其次,您不需要生成一个永远不会重复使用的向量,然后编写元素。直接写值就可以了。

for( unsigned int ID_data = 0; ID_data < 10; ++ID_data ) {
    for( unsigned int i = 0; i < data_length; i++ )
        filewrite.put(random(256));

    filewrite.write(reinterpret_cast<const char *>(&ID_data), sizeof(ID_data));
}
Run Code Online (Sandbox Code Playgroud)

第二部分:可以用两个迭代器实例化一个向量。

auto vec = std::vector<unsigned char>(std::istream_iterator<unsigned char>{file},
                                      std::istream_iterator<unsigned char>{});
Run Code Online (Sandbox Code Playgroud)

但由于您只想读取data_length值,您可能更喜欢:

auto vec = std::vector<unsigned char>{};

while( file ) {
    for( unsigned int i = 0; i < data_length; i++ ) {
        char c;
        if( !file.get(c) )
            break;
        vec.push_back(static_cast<unsigned char>(c));
    }

    unsigned int ID_data;
    file.read(reinterpret_cast<const char *>(&ID_data), sizeof(ID_data));
    // we don't use ID_data here, so it will simply be ignored.
}
Run Code Online (Sandbox Code Playgroud)