我正在尝试将C ++中的.WAV文件读取为二进制数据向量:
typedef std::istreambuf_iterator<char> file_iterator;
std::ifstream file(path, std::ios::in | std::ios::binary);
if (!file.is_open()) {
throw std::runtime_error("Failed to open " + path);
}
std::vector<std::byte> content((file_iterator(file)), file_iterator());
当我尝试编译此代码时,我得到一个错误:
初始化时无法将'char'转换为'std :: byte'
但是,如果我将向量更改为std::vector<unsigned char>
,就可以正常工作。
查看std::byte
的文档,看起来它应该像unsigned char
一样工作,所以我不确定编译器在哪里变得混乱。
您应该采用某种特殊方式将文件读取为字节向量吗? (我正在寻找一种现代的C ++方法)
我正在使用MinGW 7.3.0作为编译器。
该问题不是duplicate,因为我特别关注现代C ++技术以及该问题中未讨论的std :: byte的使用。
答案 0 :(得分:3)
std::byte
是范围enum。因此,对于char
之类的基本类型不存在转换为类型的限制。
由于std::byte
的基础类型为unsigned char
,因此在初始化期间无法将(带符号的)char
转换为byte
,因为该转换是缩小的转换
一种解决方案是使用unsigned char
向量来存储文件内容。由于byte
不是算术类型,因此byte
不存在许多数字运算(仅按位运算)。
如果必须使用std::byte
,请使用该类型定义迭代器和fstream:
typedef std::istreambuf_iterator<std::byte> file_iterator;
std::basic_ifstream<std::byte> file(path, std::ios::in | std::ios::binary);