【发布时间】:2018-02-28 19:07:16
【问题描述】:
有一个模板可以从文件中填写vector <T>:
template<typename T, typename A>
void fill_vector_from_file(const std::string &filePath, std::vector<T, A> & target)
{
std::ifstream is(filePath, std::ifstream::in);
is.seekg(0, std::ifstream::end);
std::size_t size = is.tellg();
is.seekg(0, std::ifstream::beg);
target.reserve(size);
std::string line;
while (std::getline(is, line))
{
std::istringstream line_in(line);
while (line_in)
{
T val = 0;
if (line_in >> val)
{
target.push_back(val);
}
}
}
is.close();
文件中的数据可以是 int 或 binary 并且每行存储一个数字,例如:
对于 int:
2
-3
4
对于二进制:
010
111
001
当我使用 std::vector<int> v1 检查模板中的整数时
和 std::vector<unsigned char> v2 ,v2[0] 的结果是 0 而不是 010。
(我想,我应该使用 unsigned char 来存储二进制文件)
问题:有没有办法修改模板,所以v2[0]的结果会如预期的那样(010)。
【问题讨论】:
-
unsigned char的大小只有 1 个字节。您正在逐行读取文件作为文本文件。当然,将"2"之类的行读取为int可以正常工作,因为operator>>支持这种转换。但是您不能将"010"之类的行读为unsigned char。 STL 没有用于读取二进制数字字符串的 I/O 操纵器。显示的代码将读取单个字符,因此它将改为读取'0'、'1'、'0'。您必须添加额外的代码逻辑来读取"010"行并应用您自己的转换逻辑将其转换为unsigned char(0x02)。 -
真可惜。谢谢:D
-
您必须读取第二个文件,知道数据存储为代表二进制的字符串。目前,您的模板中似乎没有这种检测。
-
>>我想,我应该使用 unsigned char 来存储二进制文件 你可以试试
std::bitset<3>输入T,然后再转换成unsigned char
标签: c++ templates binary stdvector