Std:: ios_base:: ate и std:: ios_base:: trunc

Какова точка std::ios_base::ate (кроме, например, std::ios_base::app) и std::ios_base::trunc (кроме, например, std::ios_base::out)?

И лучше ли писать std::ios_base::smth вместо std::ios::smth?

Ответы

Ответ 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. Каждое поле имеет другое значение и другое дело использования, хотя большинство из них нельзя использовать отдельно:)