б считать строку?
Но внутри-то оно читает сколько это возможно во внутренний буфер и потом оттуда отдаёт. Посмотри вывод strace.
Ну так-то мне достаточно убрать флаг нормализации и буферизация на этом закончится)
А ты не убирай. С таким успехом я могу отключить стандартную библиотеку.
Ну так её и ручками написать можно
Все возможно, только вот нужно ли это.
А ещё не стоит забывать, что гораздо эффективнее вызвать 1 раз функцию, нежели 4 тыс. раз)
Это да, но иногда элегантность важнее усложнения логики — это называется преждевременная оптимизация.
К тому же в случае ручного буфера всегда можно выбрать его размер исходя из ожидаемых данных, что также оптимизирует программу, а если для тебя пара доп строчек - это усложнение логики, то сочувствую
И как же ты решишь эту задачу таким образом, учитывая что дальше читать нельзя, чтобы не исчерпать непозиционируемый терминальный ввод?
Ну во-первых вам стоит понимать, что буфер стандартного ввода никакого отношения к буферам scanf getchar и тд не имеет. Т.к. он является частью объекта ввода/вывода с 0 номером(зачастую) в таблице дескрипторов его атрибутов.
Что? getchar() и scanf() напрямую влияют на внутренний библиотечный буфер stdin.
Ну вам стоит азы подтянуть, т.к. вы путаете буфер экземпляра структурки FILE, которым и является stdin, с буферами объектов ядра
Как минимум мой ответы выше содержат как раз именно инфу о буфере объекта стандартного ввода ядра, о чём ещё может идти речь при упоминании таблицы дескрипторов и снятия флага нормализации?)))
Таки напишите, как вы видите "эталонную" реализацию данной фунции. Не вижу способов, чтобы вышеупомянутая проблема не была затронута, самому интересно как обойти, хотя бы что-то конкретное по этому поводу напишите.
Размером буфера логично, смысл выделять буфер бо́льшего размера, чем размер чтения?
Так а если в самом начале будет новая строка, остальное попросту исчезнет?
Почему? Просто повторно вызываем нашу функцию для считывания следующей строки, буфер в которой имеет квалификатор статик
Так оно исчезнет, все что мы прочитали? Т. е. прочитали допустим 4096 байт, в начале новая строка. Остальные 4095 исчезнут?
Квалификатор статик, достаточно вначале проверять пустой ли буфер у нас и если нет - читать из него, потом снова со стандартного ввода
Что за квадификатор магический такой? Тоже хочу, как сделать?
char *get_str(int fd) { static char buff[BUFF_SIZE_]; ...
И что? Как мне мои родные 4095 байт вернуть?
Они будут храниться в этом буфере, можно также сделать статик переменную offset, в которой хранить оффсет для данного буфера
А понял, ну и костыли же.
Да не, с чего бы костыли? Все так делают
А вдруг кто-то изменил позицию или кто-то другой захотел те сокральные 4095 байт?
А, ты не в той функции сделал, а в другую выделил.
Ну это бред, кто может изменить позицию, если эта переменная также находится в скоупе функции и логику взаимодействия с ней прописываешь ты? А второй вопрос вообще неуместен, т.к. это то же самое, что твои сакральные данные захотят считать из стандартного ввода
С чего бы? При работе исключительно с этой функцией всё работает
Таки и чем это неприкрытое непотребство лучше стандартной библиотеки?
Тем, что ты сам можешь выставлять размер блока чтения, при этом одним предефайном, таким образом довольно быстро сможешь найти оптимальный размер для ожидаемых данных и своей системы.
Предлагай свои костыли кому-то другому.
Аргументация будет?
А у меня можно прочитать выше)
У вас аргументация как у Михалкова: "Если я что-то утверждаю, а вы опровергаете, то это ВЫ должны предоставить доказательства, а не я."?
Ужас, а если внимательно посмотреть?
Теоретически я всю аргументацию расписал выше, тесты под r9 5900 могу завтра приложить
Только с тем же уровнем абстракции и теми же "куртизанками".
Но если ты так сильно хочешь доказать, что я не прав - вперёд, доказывай, только аргументы не забудь захватить)
https://t.me/lame_c/72988
Обсуждают сегодня