Разделение строк на целые - PullRequest
       23

Разделение строк на целые

0 голосов
/ 18 декабря 2009

У меня есть файл, из которого я читаю, он содержит несколько строк, каждая с разным числом целых чисел, у меня возникают проблемы с разбиением его на вектор вектора целых.

Это мой текущий код.

std::vector<int> read_line()
{
    std::vector<int> ints;
    int extract_int;
    while((const char*)std::cin.peek() != "\n" && std::cin.peek() != -1)
    {
        std::cin >> extract_int;
        ints.push_back(extract_int);
    }
    return ints;
}
std::vector<std::vector<int> > read_lines()
{
    freopen("D:\\test.txt", "r", stdin);
    freopen("D:\\test2.txt", "w", stdout);
    std::vector<std::vector<int> > lines;
    while(!std::cin.eof())
    {
        lines.push_back(read_line());
    }
    return lines;
}

Проблема в том, что все целые числа читаются как одна строка.

Что я делаю не так?

Ответы [ 3 ]

7 голосов
/ 18 декабря 2009

Вы можете использовать getline() для чтения в строке, а затем строковый поток из этой строки вместо попытки обработать весь файл как один поток.

2 голосов
/ 18 декабря 2009

Проблема в вашем (const char *)std::cin.peek() != "\n" составе. слепки злы ; старайтесь не использовать их. Работает следующий код:

std::vector<int> read_line()
{
    std::vector<int> ints;
    int extract_int;
    while(std::cin.peek() != '\n' && std::cin.peek() != -1)
    {
        std::cin >> extract_int;
        ints.push_back(extract_int);
    }

    std::cin.ignore(); // You need this to discard the \n

    return ints;
}
0 голосов
/ 18 декабря 2009

Читать одну строку в векторе с

std::vector<int> read_line()
{
  std::vector<int> ints;

  std::string line;
  std::getline(std::cin, line);

  int i;
  std::stringstream ss(line);
  while (ss >> i)
    ints.push_back(i);

  return ints;
}

, а затем все векторы с

std::vector< std::vector<int> > read_lines()
{
  std::vector< std::vector<int> > lines;

  while (std::cin) {
    std::vector<int> line = read_line();

    if (std::cin)
      lines.push_back(line);
  }

  return lines;
}

Затем выведите результат с помощью

template<class T>
struct print : public std::unary_function<T,void>
{
  print(std::ostream &out) : os(out) {}
  void operator() (T x) { os << '[' << x << ']'; }
  std::ostream &os;
};

void print_vector(const std::vector<int> &v)
{
  std::for_each(v.begin(), v.end(), print<int>(std::cout));
  std::cout << '\n';
}

int main()
{
  std::vector< std::vector<int> > lines = read_lines();

  std::for_each(lines.begin(), lines.end(), print_vector);

  return 0;
}

Например:

$ cat input
1 2 3 4
5 6
7 8 9
10

$ ./try.exe <input
[1][2][3][4]
[5][6]
[7][8][9]
[10]
...