2010-03-06 2 views
3

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

ответ

1

Я так не верю - вам придется «сворачивать свои собственные».

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

0

Если вы предоставляете дополнительный 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() неочевидна?» ;-)

1

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

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