C++ Filehandling: Difference between ios::app and ios::ate?
What's the difference between ios::ate
and ios:app
when writing to a file.
In my view, ios::app
gives you the ability to move around in the file, whereas with ios::ate
it can only read/write at the end of the file. Is this correct?
It’s the other way around. When ios::ate
is set, the initial position will be the end of the file, but you are free to seek thereafter. When ios::app
is set, all output operations are performed at the end of the file. Since all writes are implicitly preceded by seeks, there is no way to write elsewhere.
They are specified as follows (in 27.5.3.1.4 of C++11):
app
seek to end before each write
ate
open and seek to end immediately after opening
With ios::app
the write position in the file is "sticky" -- all writes are at the end, no matter where you seek.
It is pretty good documented here.
ios::ate
"sets the stream's position indicator to the end of the stream on opening."
ios::app
"set the stream's position indicator to the end of the stream before each output operation."
This means the difference is that ios::ate
puts your position to the end of the file when you open it. ios::app
instead puts it at the end of the file every time you flush your stream. If, for example, you have two programs that write to the same log file, ios::ate
will override anything that was added to the file by the other program since your program opened it. ios:app
will instead jump to the end of file each time your program adds a log entry.