Если вы укажете ios::app
при открытии файла, все записи всегда будут идти в конец файла - в основном, как если бы каждой записи предшествовала f.seekp(ios::end)
.
Звучит так, как будто вы хотите ios::ate
.Он будет искать конец файла сразу после его открытия, но когда / если вы будете искать в другом месте файла и писать, запись будет идти к текущей точке файла вместо конца.
Редактировать 3: Я добавил код для поиска в конце и добавил туда еще:
#include <fstream>
#include <iostream>
int main() {
std::fstream f("test.txt", std::ios::in | std::ios::out | std::ios_base::ate);
f << " added to end.";
f.seekp(0, std::ios::beg);
f << "Original";
f.seekp(0, std::ios::end);
f << " Final.";
return 0;
}
Начиная со следующего как содержимое файла "test.txt":
Initial Value.
После запуска программы файл должен содержать:
Original value. added to end. Final.
Итак, «Добавлено в конец».получает, очевидно, добавляется в конце.Затем мы возвращаемся к началу и перезаписываем «Initial» (плюс один из двух пробелов после него) на «Original».
В качестве отступления, я должен добавить, что, по-видимому, я, по крайней мере, наполовину спал, когдаЯ писал вчера вечером - я полностью упустил тот факт, что вы указали только параметр, когда вызывали seekp
. Имея только один параметр, он принимает это как смещение в файл. К сожалению, std::ios::beg
, std::ios::cur
иstd::ios::end
являются простыми целочисленными значениями, поэтому вместо того, чтобы выдавать ошибку типа (как вам бы очень хотелось), она просто брала значение этих перечислений и использовала их как смещения в файле.К счастью, std::ios::beg
, по-видимому, имеет значение 0 (по крайней мере, в моей реализации), поэтому оно «сработало», но только случайно. С двумя параметрами (как сейчас имеет приведенный выше код) первый - это смещение, а второй -контрольная точка (начало, текущая позиция или конец), с которой начинается это смещение.