В чем разница между ios_base :: ate и ios_base :: trunc?

0

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

trunc, чтобы удалить содержимое существующего файла при создании его управляющего объекта.

Я просто не понимаю различий между ними, следующие два фрагмента кода ведут себя одинаково (они очищают содержимое перед вставкой), кто-нибудь может помочь мне разобраться в различиях?

фрагмент кода 1:

ofstream ofs(L"F:\\iMoney.txt", ios_base::trunc);
ofs << L"Hello, money~" << endl;
ofs.close();

фрагмент кода 2:

ofstream ofs(L"F:\\iMoney.txt", ios_base::ate);
ofs << L"Hello, money~" << endl;
ofs.close();
Теги:

2 ответа

2
Лучший ответ

Для std::ate чтобы иметь реальный смысл, вам нужно открыть fstream для чтения и записи:

std::fstream file("iMoney.txt", std::ios::in | std::ios::out | std::ios::ate);

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

В отличие от этого, если вы укажете std::ios::trunc, все существующее содержимое будет удалено из файла (независимо от того, будут ли указаны std::ios::in, std::ios::out или оба). Но если вы просто укажете std::ios::out, который по умолчанию для std::ofstream), все существующее содержимое будет удалено в любом случае. Единственный раз, когда std::ios::trunc добавляет что-то полезное, это то, что вы также указываете как in и out, и в этом случае существующее содержимое будет сохранено, если вы не указали std::ios::trunc.

0

Ваш пример не имеет большого значения, если файл пуст или нов, но если в файле уже содержатся символы, а затем открывается с помощью std::ios_base::ate и запись в файл будет добавлять символы при записи после открытия с помощью std::ios_base::trunc перезапишет эти символы.

  • 0
    нет, мой файл не пустой ios_base :: ate сначала очистит содержимое, затем вставит.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню