Слоупок близко ознакомился с C++, хехе.
Я, конечно, подозревал, что Страуструп и все эти комитеты курят нечто не то, но чтобы настолько :)
1. Команда установки битов состояния I/O называется
clear. Нет, есть, конечно и setstate, который делает |=, есть чтение rdstate, всё вроде вполне. Но чем надо было затянуться перед тем, как назвать установку битов clear? Кстати, при прочих равных, clear может создать exception, ну логично же! И кстати, на редкость малоинформативное. failure, блядь, ебись как хочешь, то ли Permission denied, то ли Invalid argument, хуй знает, ловите в логах до хуя информации для разбора что упало у демона. failure. Ёбаный макинтош, ЕВПОЧЯ.
2. Есть тривиальная задача - зачесть ввод до перевода строки, если сильно длинно, конец отбросить, чтобы не засирать память, ну и читать следующие. Зачем, если есть formatted input? Потому что особо одарённые личности могут забросить в демона полгига мусора, и таких одарённых слегка многовато даже в службах эксплуатации, а уж среди пользователей - ~(14%). И их всех можно понять, они не обязаны знать что и как, а пальчиком по планшету так "рраз", а дальше оно само. Я, как побывавший со всех трёх сторон боротьбы ганьбы, зрады и перемоги между пользователями, оператором и службой поддержки, вполне понимаю всех трёх, поэтому страхуюсь как могу. Поэтому построчно в буфер зараннее выделенной памяти, а потом уже анализируй it. Как это сделать? Логика подсказывать, что
getline + ignore спасут отцов русской демократии. OK. Пробуем.
2а. Выясняется, что getline в случае добивания буфера до полным-полной коробочки выставляет бит failbit. То есть, жопа в потоке. И это типа штатная диагностика переполнения. Вообще-то, по логике failbit относится к потоку, а не к стороннему буферу, но ничего лучшего комитет не придумал. Збс логика. Ну примем как должное, пелевинские буддисты мы или где?
2б. Очистки битов потока не предусмотрено. Ибо нахуа? Чем вам ебанутая конструкция
std::cin.clear(std::cin.rdstate() & (~std::ios::failbit)) ;
не очистка бита failbit? Что тут, блядь, непонятно? Напомню, что если exception по другим битам уже был и вы его обработали, тут он таки опять возникнет. Збс.
2в. Метод
ignore, который по логике должен всё отскипать до перевода строки либо до некоего числа байт, не имеет штатного способа узнать, дошёл ли он до перевода строки либо прочли уже дофига. Вы говорите
gcount()? Хуй там, дорогая редакция. В случае, когда пишем ignore(1024,'\n'), а gcount возвращает 1024, это может означать, что либо прочтено 1024 символа без перевода строки, либо прочтено 1023 символа и потом '\n'. Что делать бедной программе? getline следующую правильную строку или ignore длинную дальше? То-то... Вот если будет 1024 символа и потом '\n' - gcount вертает 1025. Ну логично же.
Итого:
Обход есть - getline, getline, getline. И не забыть очистить бит. И выключить exception на время (default state, хоть тут само не насралось). Ну и что же, что будет лишнее копирование ненужного мусора в памяти туда-сюда, память сейчас дешёвая, пользователь потерпит, а если у вас embedded - ну типа нефиг, С++ не для вас. Пишите на ассемблере.
В общем, в очередной раз убеждаюсь, что когда язык пишут не практики, как Ларри Уолл, а комитеты, будут странные логики на ровном месте.
И это я ещё до питона не добрался. Один раз я уже закомментил в скрипте "лишнее", а оно возьми и упади. Отступы, оказывается, не как у всех, а имеют охуительную внутреннюю важность в языке! Збс.
Извините, если кого Березин :)