Я разбираю входной текстовый файл. Если я возьму ввод по одной строке с помощью getline (), есть ли способ, которым я могу выполнить поиск по строке, чтобы получить целое число? Я думал о чем-то похожем на getNextInt () в Java.
Я знаю, что в этой строке ввода должно быть 2 числа; однако эти значения будут разделены одним или несколькими пробелами, поэтому я не могу просто перейти к определенной позиции.





Если там есть только пробелы и целые числа, просто попробуйте что-нибудь вроде этого:
int i1, i2;
stringstream ss(lineFromGetLine);
ss >> i1 >> i2;
или проще:
int i1, i2;
theFileStream >> i1 >> i2;
@ Роберт: Понятия не имею, в чем заключается ваша жалоба. Вы можете создать поток строк из char* так же легко, как и из std::string. Если у вас есть другой вопрос, задайте новый. Но не голосуйте против случайных ответов.
Это больше, чем немного C-ish, но вы можете использовать sscanf () в строковом представлении C. Или вы можете использовать strtol () или родственников - также в строковом представлении C.
Более похожий на C++ способ, вероятно, использовал бы строковый поток и экстрактор.
Я старался:
while (!inFile.eof()) {
getline (inFile,inputLine);
stringstream ss(inputLine);
ss >> rows >> columns;
}
и я получил следующую ошибку:
"термин не оценивает функцию, принимающую 1 аргумент" в строке
сс (inputLine);
edit: поэтому вы должны объявить поток строки в тот момент, когда вы дадите ему параметр. Исправленный код, отредактированный выше.
Следует учитывать несколько моментов:
Предположим, у вас есть два числа в каждой строке, за которыми следует текст, который вам не нужен.
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' );
}
Также обратите внимание, если единственное, что разделяет целочисленные значения, - это «пробел», то вам даже не нужно использовать строку ignore ().
Вышеупомянутое while () работает потому, что: оператор >> возвращает объект потока (ссылку). Поскольку объект потока используется в логическом контексте, компилятор попытается преобразовать его в логическое значение, а объект потока имеет оператор приведения, который выполняет это преобразование (путем вызова good () в потоке).
Важно отметить, что НЕТ использует строку
while(inFile.eof())
Если вы все же используете это, вы попадете в ловушку проблемы последней строки. Если вы прочитали все данные, eof () по-прежнему является ложным (поскольку это неверно, пока вы не попытаетесь прочитать последний EOF). Таким образом, в файле не осталось данных, но вы все равно вводите тело цикла. Затем в вашем коде getline () выполняется и завершается с ошибкой (больше нет данных), теперь EOF установлен. То, что делает остальная часть цикла, будет зависеть от того, как и где определен inLine.
Вы можете использовать этот тест, как указано выше. Но вы также должны быть готовы проверить, что поток в порядке после того, как вы его использовали.
while(inFile.eof()) // Should probably test good()
{
getLine(inFile,inputline);
if (inFile.eof()) // should probably test good()
{
break;
}
}
Вы должны нет тестировать good () и вместо этого тестировать fail (), что является тем же условием (кроме обратного), которое тестирует while (stream).
@Roget Pate: Если fail () - это противоположность good (), почему мы можем тестировать good ()?
Никогда не используйте .eof () для проверки того, можете ли вы читать, или для проверки того, не удалось ли предыдущее чтение. Оба подхода потерпят неудачу в определенных ситуациях, потому что:
В общем, вы должны использовать .eof () ТОЛЬКО после неудачного чтения, чтобы проверить, был ли сбой вызван окончанием ввода.
Используйте while (std::getline(...)) для зацикливания строк.
как СДЕЛАТЬ для строки, а не char *