Partially truncating a stream (fstream or ofstream

2020-01-29 18:03发布

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...

4条回答
Fickle 薄情
2楼-- · 2020-01-29 18:45

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楼-- · 2020-01-29 18:45

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.

查看更多
ら.Afraid
4楼-- · 2020-01-29 18:53

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.

查看更多
仙女界的扛把子
5楼-- · 2020-01-29 18:55

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().

查看更多
登录 后发表回答