2014-11-17 6 views
-1

Вот что мой test.txt выглядит следующим образом:Чтение строк, разделенных пробелами в вектор в C++

18 19 20 
21 22 23 
22 23 24 
23 24 25 
24 25 26 
25 26 27 
28 29 30 
29 30 31 

Я хочу прочитать в целых чисел в виде строк test.txt затем создать вектор 3 Интс. Если это имеет смысл, поэтому выход вектор похожий:

18 19 20, 21 22 23, 22 23 24, 23 24 25, 24 25 26, 25 26 27, 28 29 30, 29 30 31 

Heres мой код:

#include "test.txt" 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <cctype> 
#include <vector> 

using namespace std; 
struct M 
{ 
    int x; 
    int y; 
    int z; 
}; 

int main(){ 
    ifstream file; 
    file.open("test.txt"); 
    string value; 
    M XYZ; 
    vector<M> Vec; 
    if (file){ 
    while (getline(file, value)){ 
     XYZ.x = stoi(value); 
     if (value == " ") 
     XYZ.y = stoi(value); 
     if (value == " ") 
     XYZ.z = stoi(value); 
    } 
    Vec.push_back(XYZ); 
    } 
    else 
    cout << "Error openning file." << endl; 
    for (int i = 0; i < Vec.size(); i++) 
    cout << Vec[i] << endl; 
    return 0; 
} 

Я думаю, что я использую GetLine и стои правильно, но может быть неправильным. Логика кажется правильной по большей части. Спасибо заранее.

+2

... так в чем проблема? Какой у Вас вопрос? – Dai

+1

Здравствуйте, добро пожаловать в StackOverflow! Расскажите, пожалуйста, какой у вас проблемы с кодом. Если это вопрос улучшения кода, тогда его лучше спросить в [CodeReview StackExchange] (http://codereview.stackexchange.com) –

+2

Я бы заменил то, что находится внутри цикла 'while', с помощью' std :: stringstream ss; ', см. http://www.dreamincode.net/forums/topic/95826-stringstream-tutorial/, затем используйте 'ss' для заполнения структуры, например' ss >> XYZ.x >> XYZ.y >> XYZ .z; 'Таким образом, вам не нужно заботиться о пробелах и т. д. – vsoftco

ответ

1

Использование std::stringstream должно сделать вещи меньше ошибок

while (getline(file, value)) 
{ 
     std::stringstream ss(value); // must #include <sstream> 
     ss >> XYZ.x >> XYZ.y >> XYZ.z; 
} 

Ваш код не работает в настоящее время из-за того, что заметил Поттер @ Джонатан.

+0

Спасибо. Однако, когда я пытаюсь распечатать содержимое, я получаю ошибку: не могу привязать 'std :: ostream {aka std :: basic_ostream }' lvalue to 'std :: basic_ostream &&' cout << Перемещает [i] << endl ; – user3602550

+0

Это потому, что 'Moves [i]' является 'struct'. Попробуйте отобразить каждый элемент отдельно, например 'cout << Перемещает [i] .x << Перемещает [i] .y << Перемещает [i] .z' или перегружает' ostream & operator << 'для вашей структуры. – vsoftco