Вот документы из 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();
Для 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
.
Ваш пример не имеет большого значения, если файл пуст или нов, но если в файле уже содержатся символы, а затем открывается с помощью std::ios_base::ate
и запись в файл будет добавлять символы при записи после открытия с помощью std::ios_base::trunc
перезапишет эти символы.