逐行从文件读取到矢量对于<T>二进制数据C++不正确
Reading from file into vector<T> line by line works incorrect for binary data C++
有一个模板可以从文件中填充 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或二进制的,并每行存储一个数字,例如:
对于 int :
2
-3
4
和二进制:
010
111
001
当我使用std::vector<int> v1
检查整数时v2[0]
的std::vector<unsigned char> v2
是0
而不是010
。
(我认为,我应该使用未签名的char来存储二进制(
问题:是否有任何修改模板的方法,因此v2[0]
的结果将如预期(010
(。
第二文件似乎包含二进制格式的字符串。假设它们总是长3位,在这种情况下,如果您使用std::bitset<3>
,您将完全读取每个数字。如果您使用unsigned char
,则只能一次阅读一位数字。这是您的功能,略微修改了读取不同文件的示例(我想先您想知道的格式(。作为奖励,也有如何将std::bitset
向量转换为unsigned char
的示例。
#include <vector>
#include <iostream>
#include <string>
#include <fstream>
#include <bitset>
#include <algorithm> // std::transform
template<typename T, typename A>
void fill_vector_from_file(std::string const &filePath, std::vector<T, A> &vec)
{
std::ifstream ifs(filePath);
T val;
while (ifs >> val)
vec.push_back(val);
}
int main()
{
// make sample files
std::ofstream ofs("myfile.txt");
ofs << "2n" << "-3n" << "4n";
ofs.close();
ofs.open("myfile2.txt");
ofs << "010n" << "111n" << "001n";
ofs.close();
// fill <int> vector
std::vector<int> vi;
fill_vector_from_file("myfile.txt", vi);
// print int vector
for (auto n : vi)
std::cout << n << std::endl;
// fill <bitset> vector
std::vector<std::bitset<3>> vbs;
fill_vector_from_file("myfile2.txt", vbs);
// print bitset vector
for (auto n : vbs)
std::cout << n << std::endl;
// [OPTIONAL] convert to vector <unsigned char>
std::vector<unsigned char> vuc(vbs.size());
std::transform(vbs.begin(), vbs.end(), vuc.begin(),
[](std::bitset<3> const &bs) -> unsigned char { return static_cast<unsigned char>(bs.to_ulong()); });
// print vector <unsigned char>
for (auto n : vuc)
std::cout << int(n) << std::endl;
return 0;
}
工作演示:http://coliru.stacked-crooked.com/view?id=42AA04E34E4194C1
2
-3
4
010
111
001
2
7
1
此代码有很多错误,但是您的原始问题具有以下答案:
将0-1 ASCII字符串转换为整数。您的代码line_in >> val
用于VAL类型unsigned char
读取单个字符,例如'0'和'1'。您想将一个由'0和'1制成的ASCII字符串转换为形成基本数字的ASCII字符串,为整数。在此答案中,您发现val = std::stoi(line, nullptr, 2);
为您做到了。
所以," -3"answers" 101"都不是 integers ,但 strings 代表Base-10和Base-2中的整数,Stoi((转换为您的整数。但是,如果Base-10,则iostream operator>>()
也可以工作。(您也可能会查看std::setbase()
。(
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中