2014-10-25 1 views
0

Я пытаюсь прочитать текстовый файл, заполненный отдельными шестнадцатеричные значения, отформатированные как это:Чтение отдельные шестнадцатеричные значения построчно в C++

0c 10 00 04 20 00 09 1a 00 20 

То, что я хотел бы, чтобы прочитать их, преобразовать в двоичную, затем сохраните в векторе. Я хотел бы мое заявление печати на выход, как это:

00001100 
00010000 
00000000 
00000100 
00100000 
00000000 
00001001 
00011010 
00000000 
00100000 

Я думал, что правильно читаю мой файл, но я могу только показаться, чтобы получить первое шестнадцатеричное значение из каждой строки. Например: я могу читать только 0c до получения следующей строки и так далее. Если кто-то может сказать мне, что я делаю неправильно, это было бы здорово. Вот мой код:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 
#include <vector> 
#include <bitset> 

using namespace std; 

vector<bitset<8> > memory(65536); 

int main() { 

    string hex_line; 
    int i = 0; 
    ifstream mem_read; 

    //Read text file 
    mem_read.open("Examplefile.txt"); 

    if(mem_read.is_open()){ 

     //read then convert to binary 
     while(getline(mem_read, hex_line)){ 

      unsigned hex_to_bin; 
      stringstream stream_in; 

      cout << hex_line << '\n'; 
      stream_in<< hex << hex_line; 
      stream_in >> hex_to_bin; 

      memory[i] = hex_to_bin; 
      i++; 
     } 
    }else{ 
     cout << "File Read Error"; 
    } 

    //print binaries 
    for(int j = 0; j < i; j++){ 
     cout << memory[j] << '\n'; 
    } 

    mem_read.close(); 

    return 0; 
} 

ответ

1

Вы подаете только один токен в поток струн: stream_in << hex_line!

Ваш внутренний цикл должен выглядеть следующим образом:

while (std::getline(mem_read, hex_line)) 
{ 
    istringstream stream_in(hex_line); 

    for (unsigned hex_to_bin; stream_in >> hex >> hex_to_bin;) 
    { 
     memory[i] = hex_to_bin; 
     i++; 
    } 
} 

На самом деле, весь ваш код может быть уменьшен в размерах совсем немного:

#include <bitset> // for std::bitset 
#include <fstream> // for std::ifstream 
#include <iostream> // for std::cout 
#include <iterator> // for std::istream_iterator 
#include <sstream> // for std::istringstream 
#include <string> // for std::getline and std::string 
#include <vector> // for std::vector 

std::vector<std::bitset<8>> memory; 

int main() 
{ 
    memory.reserve(65536); 
    std::ifstream mem_read("Examplefile.txt"); 

    for (std::string hex_line; std::getline(mem_read, hex_line);) 
    { 
     std::istringstream stream_in(hex_line); 
     stream_in >> std::hex; 
     memory.insert(memory.end(), 
         std::istream_iterator<unsigned int>(stream_in), {}); 
    } 

    for (auto n : memory) { std::cout << n << '\n'; } 
} 
+0

Он работал. Спасибо. – David

+1

@dave: Я добавил переписку с вашей программой с аналогичной функциональностью. –

+0

спасибо. это даже лучше. – David