从 C++ 中的文本文件中读取两个十六进制值

Posted

技术标签:

【中文标题】从 C++ 中的文本文件中读取两个十六进制值【英文标题】:Reading two hex values from text file in c++ 【发布时间】:2018-10-02 11:29:49 【问题描述】:

我有一个格式如下的文件:

0x10c3 0xad6066
0x10c7 0xad6066
0x10c1 0xad6066
0x10c5 0xad6066
0x10c3 0xad6066

我想将第一个值读入数组 input[],第二个值读入数组 param[]。

我尝试了以下方法:

while(getline(f, line))
    stringstream ss(line);
    getline(ss, input[i], ' ');
    getline(ss, param[i]);

我收到的错误如下 错误:没有匹配函数调用'getline(std::stringstream&, uint16_t&, char)'

我正在尝试将字符串保存到整数数组中。那么,如何将字符串保存到整数数组中。

【问题讨论】:

请定义“不起作用”。你收到错误信息了吗?在运行时或编译时。你有没有得到意想不到的结果?如果是,那么您得到了哪些结果,它们与您的预期有何不同? 请提供minimal reproducible example 它对我来说很好,你遇到了什么错误? inputparam 的类型是什么? 看看这个***.com/questions/1070497/…@Invariance的答案 【参考方案1】:
#include <iostream>
#include <sstream>
#include <iomanip>
#include <memory>
#include <vector>
#include <iterator>
#include <algorithm>

struct Foo 
    int a;
    int b;
;

std::istream &operator>>(std::istream &input, Foo &data)

    return input >> std::hex >> data.a >> std::hex >> data.b;


std::ostream &operator<<(std::ostream &output, const Foo &data)

    return output << std::hex << data.a << " - " << std::hex << data.b;


template<typename T>
std::istream &readLineByLine(std::istream &input, std::vector<T> &v)

    std::string line;
    while(std::getline(input, line)) 
        std::istringstream lineStream  line ;
        T data;
        if (lineStream >> data) 
            v.push_back(data);
        
    
    return input;



int main() 
    std::vector<Foo> v;
    readLineByLine(std::cin, v);

    std::copy(v.begin(), v.end(), std::ostream_iterator<Foo> std::cout, "\n" );

    return 0;

https://wandbox.org/permlink/6PLekmBL5kWPA9Xh

【讨论】:

这回答了什么问题? / 这解决了什么问题? 问题很糟糕,但是如果您知道新手有什么问题,那么您可以预测他的中继需求(有时比提出解决问题更容易)。 Ant这个答案:如何读取十六进制值,逐行读取,如何将数据存储在C数组以外的其他东西中。 你的函数readLineByLine() 是毫无意义的,因为你有operator&gt;&gt; 用于Foos 并且显然知道如何使用迭代器。 std::vector&lt;Foo&gt; v std::istream_iterator&lt;Foo&gt;is, std::istream_iterator&lt;Foo&gt; ;ftw. 有点同意。恕我直言,您的答案将通过在“将值读入字符串似乎在您的代码中很好(假设 inputparam 是字符串数组)这一行添加一个句子来改进,这是获取数字的方法: "【参考方案2】:

你可以这样做:

while(getline(f, line))
    // splitting
    std::string first = line.substr(0, line.find(" "));
    std::string last = line.substr(line.find(" ") + 1);

    // print result
    std::cout<<"First: " << first << std::endl << "Last: " << last << std::endl;

【讨论】:

没错,我没有注意到这一点。我删除了声明。【参考方案3】:

如果您的数组定义为存储(无符号)整数值(例如unsigned int input[MAX], param[MAX];),您可以使用std::istringstream,例如:

std::istringstream iss;
for(int i = 0; i < MAX; i++)
     if(!getline(f, line)) break;
     iss.str(line);
     iss >> std::hex >> input[i] >> param[i];
     std::cout<< std::hex << input[i] << " " << param[i] << std::endl;

别忘了添加

#include <sstream>

在您的源代码文件中。

【讨论】:

以上是关于从 C++ 中的文本文件中读取两个十六进制值的主要内容,如果未能解决你的问题,请参考以下文章

从文本文件读取并写入二进制或十六进制文件

如何在 C++ 中读取由空格分隔的十六进制字节数据

十六进制颜色如何工作?

C++ 十六进制解析

使用十六进制数据读取文件并将其存储到python中的列表中

从十六进制转换为文本