Проверка ignore () для значений - PullRequest
3 голосов
/ 06 марта 2010

Когда вы используете ignore () в C ++, есть ли способ проверить те значения, которые были проигнорированы?Я в основном читаю несколько символов и хочу знать, игнорировал ли я нормальные символы в тексте, или я сначала получил символ новой строки.Спасибо.

Ответы [ 3 ]

1 голос
/ 06 марта 2010

Если вы на самом деле не хотите игнорировать символы, не используйте ignore() для их извлечения. get() может выполнять ту же работу, но также сохраняет извлеченные символы, чтобы вы могли проверить их позже.

1 голос
/ 06 марта 2010

Я не верю в это - вам придется «свернуть свое».

Другими словами, я думаю, вам нужно написать некоторый код, который читает из потока, используя get(), а затем добавить логику для сохранения того, что вам нужно, и игнорирования всего остального (проверяя, чтобы увидеть, что вы не обращая внимания).

0 голосов
/ 06 марта 2010

Если вы предоставите необязательный параметр delim для ignore(), то он может остановиться на новой строке:

streampos old = is.tellg();
is.ignore(num, '\n');
if (is.tellg() != old + num) {
    // didn't ignore "num" characters, if not eof or error then we
    // must have reached a newline character.
}

Однако есть загвоздка - когда ignore() попадает в разделитель, он тоже игнорирует это. Так что, если вы нажмете разделитель точно в конце вашего набора игнорируемых символов, то tellg() вернет old + num. AFAIK, нет никакого способа узнать, был ли последний игнорируемый символ разделителем. Также нет способа указать разделитель, который не является одним символом.

Я также не знаю, может ли и когда это произойти быстрее, чем просто чтение num байтов и поиск в нем строк новой строки. Моя первоначальная мысль была: "Какая часть различий между ignore() и read() неочевидна?" ; -)

...