Есть несколько вещей, которые следует учитывать:
Предположим, у вас есть два номера на каждой строке, а затем текст, который вам неинтересен.
while(inFile >> rows >> columns)
{
// Successfully read rows and columns
// Now remove the extra stuff on the line you do not want.
inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
отметить также, если единственное отделение целочисленных значений является «пустое пространство», то вам не нужно даже использовать линию игнорировать().
Вышеуказанное while() работает, потому что: оператор >> возвращает объект потока (ссылку). Поскольку объект потока используется в булевом контексте, компилятор попытается преобразовать его в bool, и у объекта потока есть оператор трансляции, который выполняет это преобразование (путем вызова good() в потоке).
Важно отметить, НЕ использовать линии
while(inFile.eof())
Если вы используете это, то вы попали в ловушку проблемы последней строки. Если вы прочитали все данные eof(), все равно false (поскольку это неверно, пока вы не попробуете прочитать EOF). Таким образом, в файле нет данных, но вы все равно входите в тело цикла. В вашем коде getline() затем выполняется и сбой (нет больше данных), теперь установлен EOF. Остальная часть цикла будет зависеть от того, как и где определяется значение inLine.
Вы можете использовать этот тест, как указано выше. Но вы также должны быть готовы протестировать поток в порядке после того, как вы его использовали.
while(inFile.eof()) // Should probably test good()
{
getLine(inFile,inputline);
if(inFile.eof()) // should probably test good()
{
break;
}
}
как это сделать для строки не char * – Yoda 2012-06-19 12:18:32
@Robert: Я понятия не имею, какова ваша жалоба. Вы можете построить строковый поток из `char *` так же легко, как и из `std :: string`. Если у вас другой вопрос, спросите новый. Но не голосуйте случайными ответами. – Eclipse 2012-06-19 14:22:15