逐行从文件读取到矢量对于<T>二进制数据C++不正确

Reading from file into vector<T> line by line works incorrect for binary data C++

本文关键字:lt gt 二进制 不正确 C++ 数据 读取 文件 逐行      更新时间:2023-10-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或二进制的,并每行存储一个数字,例如:
对于 int

2 
-3
4

二进制

010
111
001

当我使用std::vector<int> v1检查整数时v2[0]std::vector<unsigned char> v20而不是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()。(