Чтение целых чисел из текстового файла с C ++ ifstream - PullRequest
19 голосов
/ 14 ноября 2011

Я хочу прочитать информацию о смежности графов из текстового файла и сохранить ее в векторе.

  • файл имеет произвольное количество строк

  • каждая строка имеет произвольное число целых чисел, оканчивающихся на '\ n'

например,

First line:
0 1 4
Second line:
1 0 4 3 2
Thrid line:
2 1 3
Fourth line:
3 1 2 4
Fifth line:
4 0 1 3

Если я использую getline () для чтения по одной строке за раз, как мне проанализировать строку (так как каждая строка имеет переменное число целых чисел)?

Есть предложения?

Ответы [ 2 ]

17 голосов
/ 14 ноября 2011

Стандартная идиома чтения строки:

#include <fstream>
#include <sstream>
#include <string>
#include <vector>


std::ifstream infile("thefile.txt");
std::string line;

while (std::getline(infile, line))
{
  std::istringstream iss(line);
  int n;
  std::vector<int> v;

  while (iss >> n)
  {
    v.push_back(n);
  }

  // do something useful with v
}

Вот однострочная версия с использованием цикла for.Нам нужна вспомогательная конструкция (кредиты для @ Люка Дантона !), Которая противоположна std::move:

namespace std
{
  template <typename T> T & stay(T && t) { return t; }
}

int main()
{
  std::vector<std::vector<int>> vv;

  for (std::string line;
       std::getline(std::cin, line);
       vv.push_back(std::vector<int>(std::istream_iterator<int>(std::stay(std::istringstream(line))),
                                     std::istream_iterator<int>())
                    )
       ) { }

  std::cout << vv << std::endl;
}
8 голосов
/ 14 ноября 2011

Сначала прочитайте строку, используя функцию std::getline, затем используйте std::stringstream, чтобы прочитать целые числа из строки как:

std::ifstream file("input.txt");

std::vector<std::vector<int>> vv;
std::string line;
while(std::getline(file, line))
{
    std::stringstream ss(line);
    int i;
    std::vector<int> v;
    while( ss >> i ) 
       v.push_back(i);
    vv.push_back(v);
}

Вы также можете написать тело цикла как:

while(std::getline(file, line))
{
    std::stringstream ss(line);
    std::istream_iterator<int> begin(ss), end;
    std::vector<int> v(begin, end);
    vv.push_back(v);
}

Это выглядит короче и лучше. Или объединить - две последние строки:

while(std::getline(file, line))
{
    std::stringstream ss(line);
    std::istream_iterator<int> begin(ss), end;
    vv.push_back(std::vector<int>(begin, end));
}

Теперь не делайте его короче, так как это будет выглядеть уродливо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...