Подтвердить что ты не робот

В чем разница между flush() и sync() в отношении буферов fstream?

Я читал cplusplus.com учебник по I/O. В конце он говорит, что буферы fstream синхронизируются с файлом на диске

Явно, с манипуляторами: Когда некоторые манипуляторы используются на потоки, происходит явная синхронизация. Эти манипуляторы: flush и endl.

и

Явно, с функцией-членом function sync(): Вызов функция члена потока sync(), которая не принимает никаких параметров, вызывает немедленная синхронизация. Эта функция возвращает значение int, равное -1, если поток не имеет никакого связанного буфера или в случае отказа. В противном случае (если буфер потока был успешно синхронизирован) возвращает 0.

в дополнение к нескольким другим неявным случаям (например, destroy и stream.close())

В чем разница между вызовами fstream:: flush() и fstream:: sync()? епсИ?

В моем коде я всегда использовал flush().

Документация по std:: flush():

Сброс потока буфера

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

Документация по std:: streambuf:: sync():

Синхронизировать входной буфер с источником символов

Он вызывается для синхронизации буфера потока с контролируемой последовательностью (например, файл в случае файловых потоков). Функция public member pubsync вызывает эту защищенную функцию-член для выполнения этого действия.

Простите меня, если это вопрос новичков; Я ноб.

4b9b3361

Ответ 1

basic_ostream:: вровень Это не виртуальная функция, которая записывает неуправляемые изменения в базовый буфер. В случае ошибки он устанавливает флаг ошибки в используемом объекте потока. Это связано с тем, что возвращаемое значение является ссылкой на сам поток, чтобы обеспечить цепочку.

basic_filebuf:: синхронизация Это виртуальная функция, которая записывает все ожидающие изменения в основной файл и возвращает код ошибки для подтверждения успеха или отказа.

епсИ Это, когда применяется к ostream, записывает '\n' в поток и затем вызывает flush в этом потоке.

Итак, по существу: flush является более общей функцией для любого потока, тогда как sync явно привязана к файлу. flush не является виртуальным, тогда как sync является виртуальным. Это изменяет способ их использования с помощью указателей (в базовый класс) в случае наследования. Кроме того, они отличаются тем, как они сообщают об ошибках.

Ответ 2

sync является членом потоков input, все непрочитанные символы удаляются из буфера. flush является членом потоков output, а буферный вывод передается в ядро.

Ответ 3

Ввод/вывод С++ включает сотрудничество между несколькими классами: stream, buffer, locale и locale:: facet-s.

В частности, sync и flush являются функциями-членами, которые существуют как в stream, так и в streambuf, поэтому будьте осторожны с документацией, которую вы имеете в виду, поскольку они делают разные вещи.

В потоках flush указывает потоку сообщить буфер (обратите внимание на перенаправление), чтобы очистить его содержимое от адресата. Это гарантирует, что "ожидающая запись" не останется.

std::endl, когда применяется к thestream с <<, является не более чем a

thestream.put('\n'); thestream.flush();

Всегда в потоках sync указывает потоку сообщить буферу сбросить содержимое (для вывода) и прочитать (для ввода) столько, сколько возможно для пополнения буфера.

Обратите внимание, что -in buffers-sync также может быть вызвана внутри overflow, чтобы обрабатывать ситуации "заполнение буфера" (для вывода) и "буфер пустой" (для ввода).

Таким образом, sync - это гораздо более "внутренняя" функция, используемая в потоке для буферизации обмена сообщениями и буфера (где она виртуальна и переопределена в разных типах буферов), а flush - гораздо больше интерфейс между поток и клиентскую программу.

endl... является просто ярлыком.

Ответ 4

Я понял, что это так:

flush выведет данные из буферов библиотеки в буферы записи ОС и в конечном итоге приведет к полной синхронизации (данные полностью выписаны), но это определенно зависит от ОС, когда синхронизация будет завершена.

synch будет, насколько это возможно в данной ОС, пытаться принудительно выполнить полную синхронизацию, но задействованная ОС может или не может облегчить это.

Итак flush: получить данные из буфера и в строке для записи.
synch: если возможно, заставьте данные окончательно выписать, теперь.

Это было мое понимание этого, но, как я думаю об этом, я не могу вспомнить, как я пришел к этому пониманию, поэтому мне любопытно слышать и от других.