问题
I am trying to partially truncate (or shorten) an existing file, using fstream. I have tried writing an EOF character, but this seems to do nothing.
Any help would be appreciated...
回答1:
I don't think you can. There are many functions for moving "up and down" the wrapper hierarchy for HANDLE<->int<->FILE *
, at least on Windows, but there is no "proper" to extract the FILE *
from an iostreams object (if indeed it is even implemented with one).
You may find this question to be of assistance.
Personally I would strongly recommend steering clear of iostreams, they're poorly designed, heavily C++, and nasty to look at. Take a look at Boost's iostreams, or wrap stdio.h if you need to use classes.
The relevant function for stdio is ftruncate().
回答2:
The Boost.Interprocess library defines a portable truncate
function. For some reason it is not documented, but you can find it this header file.
回答3:
It'll depend on the OS. Most OSes support this, but in different ways. On Windows, there's a SetEndOfFile()
. On Unix and similar systems, you lseek
to where you want the file to end, and do an lwrite
of zero bytes there. Other OSes undoubtedly use other methods.
回答4:
I bit the bullet in the end and read the part of the file to be kept to an array then re-wrote it. It's not the best solution - but as the files will always be small I have decided to accept this method.
来源:https://stackoverflow.com/questions/2261635/partially-truncating-a-stream-fstream-or-ofstream-in-c