Я начинающий программист, не могли бы вы помочь мне представить, что такое поток, это фиксированный массив байтов, который передает данные из, например, файла в Y? А что здесь Y, буфер или что-то другое? Каким образом буфер связан с потоком?
Кроме того, я не голосовал за то, чтобы закрыть этот вопрос как слишком широкий, потому что я не считаю, что это широкий вопрос. На него есть краткий и точный ответ.
Термин «поток» используется для множества вещей, некоторые из которых перечислены в эта статья в википедии.
@ user3386109: Довольно легко представить, что OP имел в виду под «потоком», особенно в отношении «буфера» и под тегом с.
@ Амадан Да, ты читал статью? В нем перечислены несколько примеров "что такое поток", о чем спрашивал ОП.
@user3386109 user3386109 это переполнение стека, зачем мне спрашивать здесь о потоке воды или о чем-то еще?
@VanTeoLe Вы тоже не читали статью, не так ли? В статье ничего не сказано о воде.
@user3386109: user3386109: Я прочитал это, но я думаю, что OP будет сбит с толку разнообразием связанных значений. Очевидно, что значения связаны, как только их узнаешь, но в данный момент я твердо верю, что ОП должен сосредоточиться на одном из них - на том, который имеет отношение к его запросу, - и только тогда, когда это необходимо, чтобы исследовать, как это связано с другими. ВанТеоЛе - о потоке воды никто не упоминал.
@ user3386109 моя вина извините
@user3386109 user3386109 Если это был ответ мне, то на странице, на которую вы ссылаетесь, есть определение потока в одном предложении (первое предложение). Если нет, то продолжайте.
@MillieSmith Хорошо, я продолжу. Для справки: этот комментарий был направлен OP (в частности, в ответ на "Можете ли вы помочь мне представить, что такое поток") и не имел отношения к вашим комментариям.
@ user3386109 Звучит хорошо. Я определенно неправильно истолковал, поэтому извините, если вы получили уведомление о моем первом сообщении, которое я удалил (или если 28k rep позволяет вам видеть удаленные комментарии)
@MillieSmith Я думаю, что только алмазные моды могут видеть удаленные комментарии (я, конечно, не могу). Так что не беспокойтесь.
Поток — это либо источник (входной поток), либо приемник (выходной поток) данных, которые доступны (или предоставляются) во времени (в отличие от всех сразу).
Буфер — это массив (часть памяти), который используется для временного хранения данных. Входной буфер обычно заполняется операционной системой из входного потока; выходной буфер (после заполнения программистом) потребляется ОС.
Представьте, что вы хотите наполнить ванну водой. Вы начинаете с источника воды, такого как резервуар для воды или общественная водопроводная станция, которую можно перекачивать через водопроводный кран. Вы ставите ведро под водопроводный кран и включаете его. Когда ведро наполнится, вы выливаете его в ванну и снова ставите под кран. Вы повторяете это, пока ваша ванна не будет полной.
Загрузка файла, например, работает почти так же. У вас есть источник данных (файл на диске); вы открываете входной поток (программная конструкция, которая обычно выдает вам данные настолько быстро, насколько диск может их прочитать). Вы выделяете буфер (небольшой участок памяти) и указываете системе заполнить его из потока. Когда он заполнен, вы добавляете его в большой кусок выделенной памяти, который вы зарезервировали для содержимого файла, а затем позволяете буферу снова заполниться. Когда весь файл прочитан, вы закрываете поток.
Образно говоря, fflush() выливает воду из ведра в ванну?
В значительной степени, хотя он ограничен выходными буферами. Это несовершенная аналогия, но все же весьма близкая к реальности. Также обратите внимание, что существует множество буферов — некоторые вы создаете сами, некоторые находятся под капотом и используются ОС, некоторые аппаратно и у вас нет к ним программного доступа. Но цель всегда одна и та же — накапливать капающие данные, пока процесс или устройство не будут к этому готовы.
Разница между буфером и потоком
Поток — это последовательность байтов данных, которая передает информацию от или к указанному источнику.
Последовательность байтов, поступающих в программу, называется входным потоком. Последовательность байтов, исходящих из программы, называется выходным потоком. Использование Stream делает машины ввода-вывода независимыми.
Буфер — это последовательность байтов, которые хранятся в памяти.
В C операции ввода-вывода асинхронны: вы не знаете, когда у вас есть данные и сколько их. Поэтому буфер обычно используется для сбора данных из потока. (файл, сокет, устройство). Когда буфер заполнен, потребители этого потока получают уведомление и могут потреблять данные из буфера до тех пор, пока он не будет исчерпан. Затем подождите, пока буфер снова не заполнится, прежде чем использовать эти данные. Это место для временного хранения чего-либо, чтобы смягчить разницу между скоростью ввода и скоростью вывода. Пока производитель работает быстрее, чем потребитель, производитель может продолжать хранить выходные данные в буфере. Когда потребитель ускоряется, он может читать из буфера. Буфер находится посередине, чтобы преодолеть разрыв.
Y в вашем вопросе может быть файлом, сокетом или устройством (I/O).
Надеюсь, это решит ваш запрос :)