Разбор целых чисел из строки

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

Я знаю, что в этой строке ввода должно быть 2 числа; однако эти значения будут разделены одним или несколькими пробелами, поэтому я не могу просто перейти к определенной позиции.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
12 218
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Если там есть только пробелы и целые числа, просто попробуйте что-нибудь вроде этого:

int i1, i2;
stringstream ss(lineFromGetLine);
ss >> i1 >> i2;

или проще:

int i1, i2;
theFileStream >> i1 >> i2;

как СДЕЛАТЬ для строки, а не char *

Yoda 19.06.2012 16:18

@ Роберт: Понятия не имею, в чем заключается ваша жалоба. Вы можете создать поток строк из char* так же легко, как и из std::string. Если у вас есть другой вопрос, задайте новый. Но не голосуйте против случайных ответов.

Eclipse 19.06.2012 18:22

Это больше, чем немного 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).

Roger Pate 16.09.2010 00:41

@Roget Pate: Если fail () - это противоположность good (), почему мы можем тестировать good ()?

Martin York 16.09.2010 18:56

Никогда не используйте .eof () для проверки того, можете ли вы читать, или для проверки того, не удалось ли предыдущее чтение. Оба подхода потерпят неудачу в определенных ситуациях, потому что:

  • EOF не устанавливается, даже если не осталось символов, если не было попыток чтения после конца (например, после получения строки последней строки, если в конце был символ новой строки)
  • EOF устанавливается даже после успешного чтения, если операция чтения должна была искать следующий символ после конца, чтобы определить, что он должен прекратить чтение (например, после геля последней строки, если в конце не было символа новой строки)

В общем, вы должны использовать .eof () ТОЛЬКО после неудачного чтения, чтобы проверить, был ли сбой вызван окончанием ввода.

Используйте while (std::getline(...)) для зацикливания строк.

Другие вопросы по теме