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

0

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

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

----------------------------------------------------------------
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;
  }
}
  • 0
    В вашем примере какой будет метка для второй строки? Будет ли это ноль?
  • 0
    Да. Я верю, что это будет просто ноль. Это должно быть как набор инструкций. Например, если у меня была 3-я строка, а в переменной label было что-то, я хочу, чтобы код читал так: В строке 1 есть инструкция. Строка 2 пуста. В строке 3 есть инструкция. Было бы еще сказать, что этикетка находится на третьей инструкции. Надеюсь, это имеет смысл.
Показать ещё 2 комментария
Теги:
file
delimiter
getline

1 ответ

0

Я изменил ваши массивы на вектор 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;
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню