C ++ - Как преобразовать строку в несколько целых чисел? - PullRequest
2 голосов
/ 11 апреля 2019

Я рисую фигуры в SVG-файле, который я генерирую с помощью ввода, который я даю с помощью файла .dat.

Мне нужно взять строку из файла .dat, удалить из него 4 отдельных целых числа и сохранить эти целые числа в векторе.Для этого я попытался создать класс, квадрат, который содержит 4 целых числа (они представляют верхнюю левую и нижнюю правую координаты квадрата).Желательно, чтобы я мог делать это в конструкторе класса, но я понятия не имею, как это сделать.

По сути, я знаю, что у меня будет строка, похожая на "11 50 50 ", и я хочу превратить его в 4 целых числа.Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно сделать так, чтобы это было 4 целых числа объекта класса, а не только 4 целых.он сохраняет только первое целое число, которое встречается.

while (getline(file,s))
  {
    int *f = new int(stoi(s));
    vec.push_back(f);
  }

Я ценю любую помощь:)

Ответы [ 3 ]

0 голосов
/ 11 апреля 2019

Если вы читаете строку целых чисел, таких как "1 1 50 50", в строку и хотите разобрать целые числа из строки, тогда стандартный способ C ++ для обработки преобразования - создать stringstream из вашей строки и использовать iostream для извлечь целые числа из потока строк.

Например:

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

int main (void) {

    std::istringstream is { "1 1 50 50\n" };  /* simulated input */
    std::string s;
    std::vector<int> vect;

    while (getline (is, s)) {       /* read string */
        int f;                      /* declare int */
        std::stringstream ss (s);   /* make stringstream from s */
        while ((ss >> f))           /* read ints from ss into f */
            vect.push_back (f);     /* add f to vector */
    }

    for (auto& i : vect)            /* output integers in vector */
        std::cout << i << '\n';
}

(если вам нужно хранить все строки по отдельности, просто используйте std::vector<std::vector<int>> vect;)

Обратите внимание, что начальный istringstream был просто способом имитации ввода для getline.

Пример использования / Вывод

$ ./bin/ssint
1
1
50
50

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 11 апреля 2019

Используя алгоритм stringstream, istream_iterator, back_inserter и copy, мы можем написать его следующим образомэто:

while (getline(file, s))
{
    auto       str_stream       = stringstream(s);
    auto       str_iter         = istream_iterator< int >(str_stream);
    const auto end_of_str       = istream_iterator< int >();
    auto       back_insert_iter = back_inserter(vec);

    copy(str_iter, end_of_str, back_insert_iter);
}
0 голосов
/ 11 апреля 2019

Вам не нужно читать строку в std::string, так как вы можете прочитать целые числа одно за другим и напрямую сохранить их в векторе.Попробуйте что-то вроде следующего.

#include <fstream>
#include <vector>

int main()
{
  std::ifstream ifile("./yourfile.dat");

  std::vector<int> theIntegers;

  for (int idx = 0, val = 0; idx < 4; ++idx)
  {
    ifile >> val;
    theIntegers.push_back(val);
  }
}

РЕДАКТИРОВАТЬ: Вы можете прочитать файл в конструкторе, просто передав std::istream по ссылке на конструктор.В приведенном ниже примере я предполагаю, что вы хотите прочитать ровно четыре целых числа, отбрасывая возможный остаток строки.

#include <istream>
#include <string>
#include <array>

/*
 * This class holds four integers to describe a square
 * On construction, it reads four integers from a given std::istream
 * Note that it does not check the formatting of the input file and
 * that it reads the first four integers and discards the remaining
 * characters until the next newline character.
 */

class Square
{
  std::array<int, 4> d_coordinates;

  public:
    Square() = delete;

    Square(std::istream &iFile)
    {
      for (int idx = 0, val = 0, n =  size(d_coordinates); idx < n; ++idx)
      {
        iFile >> val;
        d_coordinates[idx] = val;
      }

      // Remove the newline character at the end of this line
      // If you for some reason want to store multiple squares
      // on a single line, then just remove the next two lines

      std::string tmp;
      std::getline(iFile, tmp); 
    }
};

int main()
{
  std::ifstream ifile("./yourFile.dat");

  Square x(ifile);
  Square y(ifile);
  Square z(ifile);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...