2013-05-04 2 views
4

Я пытаюсь прочитать в файле, который имеет 5 строк, и каждая строка длиной 3-4 строки. Вот мой входной файл:C++ getline и stringstream

10:30 Hurley 1234567A 10:15 
10:45 Hurley 1234567A 11:30 
08:35 Jacob 1x1x1x1x1x 
08:35 Jacob 1x1x1x1x1x 08:10 
08:05 Jacob 1x1x1x1x1x 
08:45 Sayid 33332222 09:15 

И это то, что я получаю:

10:30 Hurley 1234567A 10:15 
10:45 Hurley 1234567A 11:30 
08:35 Jacob 1x1x1x1x1x 11:30 
08:35 Jacob 1x1x1x1x1x 08:10 
08:05 Jacob 1x1x1x1x1x 08:10 
08:45 Sayid 33332222 09:15 

Это мой код:

void enor::Read(status &sx,isle &dx,ifstream &x){ 
    string str; 
    getline(x, str, '\n'); 
    stringstream ss; 
    ss << str; 
    ss >> dx.in >> dx.name >> dx.id >> dx.out; 
    /*getline(x, str, '\n'); 
    x>>dx.in>>dx.name>>dx.id>>dx.out;*/ 
    if(x.fail()) 
     sx=abnorm; 
    else 
     sx=norm; 
} 

Как можно прочитать в файле, не имея 3-й и 5-я линия, заполненная 2-й и 4-й строками? Я хочу, чтобы dx.out был пустым. Должен ли я использовать другой метод, или это можно сделать с помощью stringstream?

+0

Можете ли вы показать, как вы называете эту функцию тоже? Вы повторно используете объект 'dx'? –

+0

void enor :: First() { Чтение (sx, dx, x); Next(); } void enor :: Next() { end = sx == abnorm; если (! Конец) { current.in = dx.in; current.name = dx.name; current.id = dx.id; current.out = dx.out; Чтение (sx, dx, x); /* while (sx == norm && dx.id == current.id) { if (dx.in> current.out) Read (sx, dx, x); } */ } } – wfmn17

ответ

3

Если >> видит, что в stringstream ничего не осталось, он оставит переменную нетронутой - так dx.out сохраняет свое значение с последней строки. Тем не менее, вы можете сделать

ss >> dx.in >> dx.name >> dx.id; 
if (!(ss >> dx.out)) 
    dx.out = ""; 

потому что ss >> dx.out возвращается ss, а когда поток преобразуется в bool (например, когда он используется в if состоянии), он возвращает false если последнего чтения попытка не удалась.

+0

спасибо, работает безупречный !! – wfmn17

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