В чем разница между 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 вызывает эту защищенную функцию-член для выполнения этого действия.
Простите меня, если это вопрос новичков; Я ноб.
Ответы
Ответ 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
: если возможно, заставьте данные окончательно выписать, теперь.
Это было мое понимание этого, но, как я думаю об этом, я не могу вспомнить, как я пришел к этому пониманию, поэтому мне любопытно слышать и от других.