<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=250473&amp;view=findpost&amp;p=2077014</guid>
        <pubDate>Thu, 25 Sep 2008 19:55:07 +0000</pubDate>
        <title>Буферизация при чтении функциями С и Win32</title>
        <link>https://forum.sources.ru/index.php?showtopic=250473&amp;view=findpost&amp;p=2077014</link>
        <description><![CDATA[tumanovalex: Спасибо большое за подробное объяснение, видимо, мне надо поглубже разобраться с понятиями ввода-вывода в С (С++) и ОС. Сейчас у меня какая-то каша в голове, буду приводить голову в порядок.]]></description>
        <author>tumanovalex</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=250473&amp;view=findpost&amp;p=2074746</guid>
        <pubDate>Tue, 23 Sep 2008 07:52:15 +0000</pubDate>
        <title>Буферизация при чтении функциями С и Win32</title>
        <link>https://forum.sources.ru/index.php?showtopic=250473&amp;view=findpost&amp;p=2074746</link>
        <description><![CDATA[leo: Во-первых, я уже говорил, что setvbuf не имеет и не может иметь никакого отношения к буферизации ОС. Сам подумай - FILE_FLAG_NO_BUFFERING можно задать только при открытии файла CreateFile, а setvbuf можно использовать только для уже открытого файла. Поэтому если бы в C была возможность отключать буферизацию ОС, то она должна была бы сидеть в параметрах fopen, но никак не в функциях, работающих с уже открытым файлом.<br><br>Во-вторых, не путай функции приложения и ОС. Грубо говоря к ОС относится функции ядра и та часть юзермодного АПИ, на которую ты или не можешь повлиять вообще или только в пределах, представляемых этим АПИ. В частности буферизацию файлов в ОС можно только включить&#092;выключить (FILE_FLAG_NO_BUFFERING) и косвенно&#092;частично повлиять на механизм буферизации (FILE_FLAG_SEQUENTIAL_SCAN), но все тонкости буферизации ОС оставляет за собой. Все  остальное относится к самому приложению, в т.ч. и fopen и setvbuf - хочешь используй, хочешь не используй или вообще пиши на чистом АПИ, хочешь используй свой буфер, хочешь не используй. Поэтому не &quot;windows создает буфер, который я использую в программе&quot;, а ты сам создаешь этот буфер, используя средства АПИ или С&#092;С++. Ну и функции С это ес-но просто часть кода твоего приложения, написанная за тебя добрыми дядями с целью упрощения&#092;унификации&#092;портируемости и т.д.и т.п. <br><br>В-третьих, судя по твоему коду, похоже ты не понял предназначение setvbuf. Не понимаю, как тебе пришло в голову выделить буфер, назначить его в setvbuf и затем в него же читать fread ?&#33; :wacko: Буферирование стрима нужно только при чтении текстовых файлов и малых порций двоичных данных (например, в дельфи&#092;паскале для двоичных файлов внутренняя буферизация вообще не предусмотрена - только для текстовых). В этом сл.увеличение размера буфера положительно сказывается на производительности, т.к. уменьшается число обращений к ReadFile и связанных с эти накладных расходов на переключение юзер-мод&#092;кернел-мод. Если же есть возможность&#092;желание читать двоичные данные большими блоками, то логичнее отключать буферизацию стрима установкой _IONBF и читать данные прямо в свой буфер.]]></description>
        <author>leo</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=250473&amp;view=findpost&amp;p=2072881</guid>
        <pubDate>Sat, 20 Sep 2008 06:30:49 +0000</pubDate>
        <title>Буферизация при чтении функциями С и Win32</title>
        <link>https://forum.sources.ru/index.php?showtopic=250473&amp;view=findpost&amp;p=2072881</link>
        <description><![CDATA[tumanovalex: Меня заинтересовал вопрос о буферизации ввода-вывода и я решил попробовал проверить, так ли я все понимаю, на конкретной программе. В ней читается один и тот же файл функциями С и Win32 с включенной буферизацией и выключенной. Удобно смотреть, как это работает, на примере чтения небольшого файла (я смотрел на файле 10 мб) с CD. Функция Win32 CreateFile действительно отключает буферизацию (файл читается с диска постоянно, индикатор горит), а функция setvbuf буферизацию не отключает (файл читается один раз, индикатор гаснет, но в программе чтение происходит). Правильно ли я понимаю принципы работы этой программы в Windwows (программу прилагаю):<br>1. Windows выделяет свои буферы для операций чтения-записи файла в рамках функции CreateFile . Если я отключаю буферизацию, а в программе использую свой буфер, то windows создает в памяти только буфер, который я выделяю в своей программе, никаких других буферов не используется. В связи с этим все время читается файл с диска CD.<br>2. Если я буферизацию не отключаю, то Windows при работе функции CreateFile выделяет свои буферы (буфер1) (интересно, исходя из каких принципов определяется размер этих буферов) и, кроме того, создает буфер, который я выделяю в своей программе (буфер2). При чтении файл читается в буфер1 и, если он умещается целиком, далее в буфер2 он читается из буфера1. Поэтому индикатор дисковода не горит.<br>3. Я думал, что при использовании функции С будут достигаться те же результаты, что и при использовании функций Win32 (думал, что при компиляции в exe идут вызовы функций Win32) и думал, что setvbuf отключает буферизацию Windows (bufer1). Однако, как показывает программа, это не так (если я все правильно делаю).<br>Покритикуйте, пожалуйста, мои взгляды на буферизацию и объясните, пожалуйста, почему не работает setvbuf.]]></description>
        <author>tumanovalex</author>
        <category>Visual C++ / MFC / WTL</category>
      </item>
	
      </channel>
      </rss>
	