Ответ 1
std:: ios_base:: ate позиционирует курсор в конце текста, тогда как std:: ios_base_app добавляет текст (с записью) в конце, хотя вы все еще можете прочитать с самого начала:)
std:: ios_base:: trunc обрезает файл, чтобы он был опустошен, тогда как std:: ios_base:: out просто указывает, что вы хотите записать в поток.
В настоящее время я не могу процитировать стандарт (на моем планшете и Acrobat Reader не будет разрешена копия), но из пункта 27.4.2.1.4 из ISO 14882: 1998 информация, которую вы видите на ссылке, почти точна: http://cplusplus.com/reference/iostream/ios_base/openmode/
Подводя итог:
std::ios_base::app = append
Добавить в конце потока "seek [ing] для завершения перед каждой записью"
std::ios_base::ate = At The End
Открывать и искать сразу в конце после открытия
std::ios_base::binary = binary
Выполните операцию в двоичном формате, а не в тексте
std::ios_base::in = input
Открыть в режиме чтения
std::ios_base::out = output
Открыть в режиме записи
std::ios_base::trunc = truncate
Обрезать поток при открытии.
Эти значения являются только флагами, поэтому вы можете открыть поток в бинарнике чтения/записи в конце с помощью:
std::ios_base::in | std::ios_base::out | std::ios_base::ate | std::ios_base::binary
Что касается способа использования этих значений, он по вашему желанию. Они объявляются публичными статическими полями в классе std::ios_base
(см. 27.4.2), поэтому их можно получить с помощью std::ios::ate
или даже что-то вроде cout.binary
!
Точки, на которые вы должны обратить внимание, это то, что std::ios_base::ate
НЕ означает std::ios_base::app
, а std::ios_base::out
не означает std::ios_base::trunc
. Каждое поле имеет другое значение и другое дело использования, хотя большинство из них нельзя использовать отдельно:)