С++ - Как получить строки из файла для сохранения в виде отдельных строк

Любая помощь в этом будет оценена по достоинству, так как я очень застрял.

Для этого проекта мы должны сначала получить входные данные из файла. Вот как может выглядеть файл:

----------------------------------------------------------------
Hi     Then  Finish
       End   Okay

----------------------------------------------------------------

Here is the layout for it:
Character Set 1: 1-6
Character Set 2: 7 (always a space)
Character Set 3: 8-11 
Character Set 4: 12-13 (always 2 spaces)
Character Set 5: 14-19

Мне было интересно, есть ли способ получить определенное количество символов для строки. Также каждый из наборов символов будет иметь разные переменные.

Например: набор символов 1 будет называться метка, набор символов 3 — код, а набор символов 5 — операция.

Я пробовал что-то вроде

for (int i = 0; !text.eof(); i++){
   getline(text, label[i]);
   getline(text, code[i]);
   getline(text, operation[i]);
}

Если это поможет, вот мой код на данный момент... хотя он не работает должным образом:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main() {
  const int MAX     = 100;
  string    str;
  string    symLabel[MAX];
  string    opCode  [MAX];
  string    operand [MAX];

  ifstream sim("simprog.txt");

  for (int i = 0; !sim.eof(); i++){

    getline(sim, str);

    symLabel[i] = str.substr(0, 6);
    opCode[i]   = str.substr(8,11);
    operand[i]  = str.substr(13, 18);

    cout << symLabel[i] << endl;
    cout << opCode[i]   << endl;
  }
}

person user2329764    schedule 22.03.2014    source источник
comment
В вашем примере какой будет метка для второй строки? Будет ли он нулевым?   -  person jpw    schedule 23.03.2014
comment
Да. Я считаю, что это будет просто нуль. Это должно быть похоже на набор инструкций. Например, если бы у меня была 3-я строка и в переменной метки что-то было, я хочу, чтобы код читал это так: в строке 1 есть инструкция. Строка 2 пуста. В строке 3 есть инструкция. Еще бы сказать, что метка стоит на третьей инструкции. Надеюсь, это имеет смысл.   -  person user2329764    schedule 23.03.2014
comment
Кроме того, макет файла исправлен? Будет ли поле всегда иметь заданную ширину, как вы описали?   -  person jpw    schedule 23.03.2014
comment
Да. Это всегда будет 6 символов для первого столбца, пробел, 4 символа для второго столбца, 2 пробела и 6 символов для последнего столбца. В первом столбце иногда будут только пробелы.   -  person user2329764    schedule 23.03.2014


Ответы (1)


Я изменил ваши массивы на вектор rec, где rec — это структура ваших строк с добавленным конструктором копирования и оператором =, чтобы сделать его совместимым с контейнерами STL. Это не ограничит вас определенным количеством строк ввода. Остальное — лишь некоторые изменения в вашем коде.

struct rec
{
    rec() { }
    rec(const rec &r) { *this = r; }
    rec &operator=(const rec &r)
    {
        if (this != &r)
        {
            symLabel = r.symLabel;
            opCode = r.opCode;
            operand = r.operand;
        }
        return *this;
    }
    std::string    symLabel;
    std::string    opCode;
    std::string    operand;
};

int main(int argc, char *argv[])
{
   std::string    str;
   std::vector<rec> records;

   std::ifstream sim("simprog.txt");

   char bf[100];
   while(sim.good())
   {
       sim.getline(bf, sizeof(bf));
       str = bf;

       rec r;
       r.symLabel = str.substr(0, 6);
       r.opCode   = str.substr(7, 5);
       r.operand  = str.substr(13, 6);

       records.push_back(r);
   }

   for (size_t i=0; i< records.size(); i++)
   {
       std::cout << records[i].symLabel << std::endl;
       std::cout << records[i].opCode   << std::endl;
   }

   return 0;
}

Обратите внимание, что для этого требуется правильно отформатированный файл, как вы его указали. Если изменится формат строки или последняя строка будет неполной, у вас будут проблемы :)

person DNT    schedule 22.03.2014