Member 13475664 Ответов: 2

Чтение файла и сохранение его в классе


Я читаю текстовый файл, где мои входные данные выглядят следующим образом

date Fri Sep 1 02:11:40.195 pm 2017
base hex  timestamps absolute
internal events logged
// version 9.0.0
Begin Triggerblock Fri Sep 1 02:11:40.195 pm 2017
   0.000000 Start of measurement
   0.002893 1  201             Rx   d 8 06 0D 00 B0 89 00 0D E7  Length = 227925 BitCount = 118 ID = 513
   0.003133 1  280             Rx   d 8 1B 0C 7C F1 E8 75 39 67  Length = 221910 BitCount = 115 ID = 640
   0.003375 1  281             Rx   d 8 6B 0C 00 4E F4 07 8F 18  Length = 223925 BitCount = 116 ID = 641
   0.003623 1  282             Rx   d 8 DA 0C 23 FA 01 02 2C 04  Length = 227910 BitCount = 118 ID = 642


мне нужно сделать так,чтобы файл считывался из строки 6 и сохранялся каждый из них в переменной класса, а также пропустить чтение длины, bitcount и ID

может ли кто-нибудь подсказать мне, как я мог бы их установить

мой класс выглядит следующим образом
class data_Read
{
public:
	double time;
	unsigned int state;
	std::string  ID;
	std::string status;
	std::string type;
	unsigned int byte_lent = 8;
        std::string message[];

public:
	void readData(std::istream& is, data_Read& data);
};

and readdata function like this

void data_Read::readData(std::istream& is, data_Read& data)
{
	std::string line;

	for (int i = 0; i <= 5; i++)
	{
		std::getline(is, line);
	}
	
	while (std::getline(is, line))
	{
		std::istringstream iss(line);

		iss >> data.time;
		iss >> data.state;
		iss >> data.ID;
		iss >> data.status;
		iss >> data.type;
		
		for (int i = 1; i <= data.byte_lent; i++)
		{
			iss >> data.message[i];
		}
	}

	cout << data.time << "/t" << data.state << "/t" << data.ID << "/t" << data.status << "/t" << data.type << "/t" << data.message;
}


какие изменения я мог бы сделать, чтобы получить результат, как я хочу

Что я уже пробовал:

я попробовал инициализировать строку, но ничего не вышло и дал петлю для чтения первых 5 строк, а затем и следующих

2 Ответов

Рейтинг:
4

CPallini

Следующая программа

#include <iostream>
#include <sstream>
#include <string>
#include <array>
#include <vector>
#include <iomanip>

using namespace std;

struct Data
{
  static constexpr size_t SIZE = 8;
  double time;
  int id;
  int status;
  string type;
  string dir;
  std::array<uint8_t, SIZE> d; 
  bool parse_line(const string & line);
};

ostream & operator << ( ostream & os, const Data & data);

int main()
{
  string line;
  vector <Data> v;

  while ( getline(cin, line) )
  {
    Data d;
    if ( d.parse_line(line) )
      v.push_back( d );
  }
  
  for (const auto & d : v)
    cout << d << endl;
}

ostream & operator << ( ostream & os, const Data & data)
{
  os << "time " << data.time << "\tid " << data.id << "\tstatus " << data.status << "\ttype " << data.type << "\tdir " << data.dir << "\tdata ";
  for (size_t n=0; n < Data::SIZE; ++n)
    os << setw(4) << static_cast<unsigned int>(data.d[n]);
  return os;
}

bool Data::parse_line( const string & line )
{
  istringstream iss(line);

  iss >> time;
  if ( ! iss ) return false;
  iss >> id;
  if ( ! iss ) return false;
  iss >> status;
  if ( ! iss ) return false;
  iss >> type;
  if ( ! iss ) return false;
  iss >> dir;
  if ( ! iss ) return false;

  int count;
  iss >> count;
  if ( ! iss ) return false;
  for ( size_t n= 0; n< SIZE; ++n)
  {
    size_t pos;
    string hex;
    iss >> hex;
    if (!iss) return false;
    d[n] = static_cast<uint8_t>( stoul(hex, &pos, 16));
    if ( pos != 2 ) return false;
  }
  return true;
}

кормили ваших входных данных (перенаправить его к вам iputfrom степень вашего файла), дает следующий результат:
time 0.002893	id 1	status 201	type Rx	dir d	data    6  13   0 176 137   0  13 231
time 0.003133	id 1	status 280	type Rx	dir d	data   27  12 124 241 232 117  57 103
time 0.003375	id 1	status 281	type Rx	dir d	data  107  12   0  78 244   7 143  24
time 0.003623	id 1	status 282	type Rx	dir d	data  218  12  35 250   1   2  44   4


Member 13475664

большое спасибо за помощь

CPallini

Добро пожаловать.

Рейтинг:
0

Jochen Arndt

Что вы получаете и чего ожидаете?

Кроме того, почему вы изменили свой message член в а std::string массив вместо того, чтобы позволить ему uint8_t массив, используемый в вашем предыдущем вопросе Считывание и хранение массива шестнадцатеричных данных[^]?

Единственная проблема, которую я вижу, заключается в том, что вы забыли прочитать длину сообщения byte_lent:

iss >> data.time;
iss >> data.state;
iss >> data.ID;
iss >> data.status;
iss >> data.type;
// Reading the length is missing in your code
iss >> data.byte_lent;
for (unsigned int i = 0; i < data.byte_lent; i++)
{
    // Read msg data bytes here
}
[Правка: уточнение]
Цитата из (Не а) решения:
и игнорируйте 8 и длину, bitcount и ID
Если вы хотите игнорировать длину, вам все равно придется прочитать ее из потока. В противном случае он будет считан как данные первого сообщения.

Оставшиеся данные после байтов сообщения пропускаются просто не считыванием дальше из буфера потока, а обработкой следующей строки.
[/РЕДАКТИРОВАТЬ]