Чтение неизвестного количества целых чисел, разделенных пробелами, в один вектор на строку

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

Вот пример такого файла:

11 3 0 1
4 5 0 3
2 3 4 1
23 4 25 15 11
0 2 6 7 10
5 6 2
1
11

Мне удалось успешно прочитать небольшие объемы данных, используя следующий метод (обратите внимание, что external_layers — это вектор, содержащий эти векторы, которые я пытаюсь заполнить):

for (int i = 0; i < outer_layers.size(); i++)
{
    while (in >> temp_num)
    {
        outer_layers[i].inner_layer.push_back(temp_num);
        if (in.peek() == '\n')
            break;
    }
}

Однако, когда я пытаюсь читать большие объемы данных, иногда они читаются в две строки под одним вектором. В одном из файлов из 24 строк он дважды читал двухстрочные строки, поэтому последние два вектора не имели данных.

Я не могу уложить это в голове. Любые идеи, что я делаю неправильно?

EDIT: Что-то интересное, что я заметил в некоторых строках файла создателя проблем, это:

Допустим, есть три строки.

23 42 1 5
1 0 5 10
2 3 11

Строка №1 прекрасно читается как 23 42 1 5; однако строки № 2 и № 3 читаются вместе как 1 0 5 10 2 3 11.

В Notepad++ они выглядят нормально, каждый на своей строке. Однако в Блокноте они выглядят так:

23 42 1 51 0 5 10 2 3 11

Если вы заметили, 5 (последнее целое число в строке №1) и 1 (первое целое число в строке №2) не разделены пробелами; однако 10 и 2 разделены пробелом.

Я заметил такое поведение на любых строках с двойным считыванием. Если они разделены пробелом, то они оба считываются. Не уверен, почему это происходит, учитывая, что там все еще должен быть символ новой строки, чтобы Notepad ++ отображал на отдельных строках, я прав?


person B.K.    schedule 29.11.2013    source источник


Ответы (1)


Я не знаю, как настроены ваши outer_layers и inner_layers, но вы можете использовать std::getline< /a> и std::stringstream, чтобы заполнить ваши векторы примерно так:

    std::vector< std::vector<int> > V ;
    std::vector <int> vec;

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

    std::string line;
    int i;
    while (std::getline( fin, line) ) //Read a line 
    {
       std::stringstream ss(line);

       while(ss >> i) //Extract integers from line
         vec.push_back(i);

       V.push_back(vec); 
       vec.clear();

    }

  fin.close();

  for(const auto &x:V)
  {
    for(const auto &y:x)
      std::cout<<y<<" ";
    std::cout<<std::endl;
  }
person P0W    schedule 29.11.2013
comment
Спасибо. Это сработало очень хорошо. Все еще интересно, что не так с этим целым пробелом и отсутствием пробела между строками (пояснение в моем редактировании). - person B.K.; 29.11.2013
comment
@Noobacode Я не уверен, что вы имели в виду, но похоже на некоторые проблемы CR и LF, обычно возникающие, когда вы сохраняете текстовые файлы в Linux и используете в Windows или наоборот. - person P0W; 29.11.2013
comment
Хм, может быть. Файлы были сохранены на Mac OS. Спасибо! - person B.K.; 29.11.2013