逐个保存unsigned char矢量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逐个保存unsigned char矢量相关的知识,希望对你有一定的参考价值。

#include "stdafx.h"
#include "Compiler.h"
#include <fstream>

int main() {
    std::ofstream output("file.bin", std::ios::binary | std::ios::trunc);
    if(output.fail()) {
        return 1;
    }
    std::vector<unsigned char> f = Runtime::convert_line_to_instructions("rt_reg str Hello");
    for(unsigned char i : f) {
        //output.write(reinterpret_cast<char*>&i, sizeof(unsigned short)); doesn't work here.
    }
    std::cerr << "Program Compiled!" << std::endl;
    while(true);
    return 0;
}

如何将unsigned char矢量保存到文件中?我已经尝试了几种解决方案(包括已经注释掉的解决方案),但它们都没有奏效。

* convert_line_to_instructions也返回一个unsigned char向量。

答案

使用output.put(i);,因为它一次只需要一个字符。

但是你真的想跳过for循环,只需在一次写入中写入整个向量:

output.write(f.data(), f.size());
另一答案

它是一个fstream,所以你可以使用像<<这样的iostream运算符。

#include <fstream>
#include <iostream>
#include <vector>

int main(const int argc, const char* argv[]) {
    std::ofstream output{"file.bin", std::ios::binary | std::ios::trunc};
    if (output.fail())
        return 1;

    std::vector<unsigned char> input = {'r', 't', '_', 'r', 'e', 'g', ' ',
                                        's', 't', 'r', ' ', 'H', 'e', 'l',
                                        'l', 'o'};

    for (const auto i : input)
        output << i;

    return 0;
}

稍微更干净的方法是使用带迭代器的STL算法:

std::copy(begin(input), end(input), std::ostreambuf_iterator<char>(output));

ostreambuf_iterator<char>是轻量级的,缓冲的,不执行格式化。

以上是关于逐个保存unsigned char矢量的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中,unsigned char是啥类型

在C语言中,unsigned char是啥类型

java jni 调用 c 代码, c 中 unsigned char* 数据 如何传给java?

std::string 与 unsigned char[] 和 unsigned char* 有啥不同?

将 char* 转换为 unsigned char*

为啥我的 C 代码片段不起作用?简化版可以。为 unsigned long long 传递不带 VA_ARGS 的 args