2013-11-29 5 views
1

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

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

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 

я был в состоянии прочитать в небольших объемах данных, успешно используя следующий метод (Обратите внимание, что outer_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 

Line # 1 читает просто отлично, как 23 42 1 5; однако строки # 2 и # 3 считываются вместе как 1 0 5 10 2 3 11.

В Блокноте ++ они выглядят просто отлично, каждый на своих линиях. Тем не менее, в Блокноте, то они выглядят так:

23 42 1 51 0 5 10 2 3 11 

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

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

ответ

5

Я не знаю, как ваш outer_layers и inner_layers настроен, но вы можете использовать std::getline и 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; 
    } 
+0

Спасибо. Он работал очень хорошо. Все еще интересно, что было не так с этим пространством и не было пробелов между строками (объяснение в моем редактировании). –

+1

@Noobacode Я не уверен, что вы имели в виду, но выглядит как некоторые проблемы с CR и LF, как правило, происходит при сохранении текстовых файлов в Linux и использовании в Windows или наоборот – P0W

+0

Хм, это может быть так. Файлы были сохранены на Mac OS. Благодаря! –

Смежные вопросы