Чтение двух шестнадцатеричных значений из текстового файла в C ++ - PullRequest
0 голосов
/ 02 октября 2018

У меня есть файл, который отформатирован следующим образом:

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

Я хочу прочитать первое значение в массив ввода [], а второе в массив param [].

Я попробовал следующее:

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

Я получаю следующую ошибку: нет соответствующей функции для вызова 'getline (std :: stringstream &, uint16_t &, char)'

Я пытаюсь сохранить строку в массив целых чисел.Итак, как мне сохранить строку в целочисленный массив.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Если ваши массивы определены для хранения (без знака) целочисленных значений (например, 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>

в вашем файле исходного кода.

0 голосов
/ 02 октября 2018
#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

0 голосов
/ 02 октября 2018

Вы можете сделать это так:

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;
}
...