2013-03-25 5 views
0

У меня есть файл данных для чтения, то есть что-то вроде этогоЧтение строки и целое на одной и той же линии

джон 1 2 3 4

Я хочу, чтобы прочитать эти данные и выполнять некоторые функции, просто хочу чтобы я сделал это правильно.

while(myIn.peek()!=EOF) 
{ 
getline(myIn, name, '/n'); 
myIn>>a>>b>>c>>d; 
} 

ответ

1

Ваш код будет испорчен, если следующий символ не является конечным файлом, но в процессе извлечения произошел сбой. Это часто происходит в конце файлов, где есть до \n.

У вас также есть проблемы со звонком в getline. /n - многобайтовый символ. Предположительно, вы имели в виду \n, но даже тогда нет \n после «john» в строке. Вместо этого просто используйте myIn >> name.

В любом случае, это более идиоматично использовать ваши экстракции как условие while. Попробуйте это:

while (myIn >> name >> a >> b >> c >> d) { 
    // Do something with them 
} 

Тела цикла while просто не будет выполняться, если какие-либо из извлечений неудачи. Это означает, что вы можете быстро выйти, прежде чем наносить больше урона. Однако здесь нас действительно не волнует, находится ли каждый набор значений на отдельной строке или нет. Он бы с удовольствием принимает:

john 1 2 3 4 mary 5 6 7 8 

Альтернативы читать всю строку с std::getline первыми, а затем вы можете разобрать строку:

std::string line; 
while (std::getline(myIn, line)) { 
    std::stringstream line_stream(line); 
    if (line_stream >> name >> a >> b >> c >> d) { 
    // Do something with this line 
    } 
} 

Теперь, даже если линия плохо отформатирована, вы» я все равно перейду к следующей строке, а не откажусь от всего вместе.

+0

ну, файл данных имеет несколько строк с одинаковой структурой, я хочу прочитать одну строку, выполнить некоторые функции, а затем перейти к следующей строке. Спасибо за вашу помощь! –

+0

@JasonLee Тогда, возможно, вы предпочтете второй вариант. Мне нравится, когда я делаю линейную обработку. –

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