C++ std::fstream - how do I resize?

Started by
3 comments, last by atetanat 16 years, 8 months ago
hi I'm after a tidy way to write, read and resize data in an open (binary) file. Since std::fstream does the first two it seems the best choice. I'm after something like: std::fstream::put_EOF_here() or std::fstream::set_file_size(std::streampos pos) If it only works when shrinking, that's OK as I plan to append data when enlarging, to prevent putting indeterminate data in the file, and I can do this with std::fstream::write(). thanks.
Advertisement
After searching for a while, all I find are people complaining that there isn't a standard way to do this - resize any file - without copying all the data to memory or a new file.

I'm kinda surprised, isn't this a pretty basic obvious file operation?

Is there a reason why this is missing?

Read it in, and write out the bits you want to write out. That's how it's done.
Quote:Original post by atetanat
I'm kinda surprised, isn't this a pretty basic obvious file operation?


Indeed, but I wouldn't call it a terribly standard one. It seems to me that most file I/O is implemented as a one-shot transformation: either from file to useful-in-memory-representation, or vicea versa. Simple, crude, but effective in most cases. Of course, this is probably encouraged by the original lack, a "chicken and the egg" type of situation if you will.

In other words, by the time you get up to actually having a good reason to do in-place overwrites and resizes instead of the simplicity of a simple resave, you're in a bit of an exceptional situation when it comes to filesystems, and will probably be using nonstandard OS-specific functionality anyways.

Of course, all this really is, is making excuses for a woefully tiny C++ standard library -- which is in fact microscopic, tiny, and small. There are plenty of things which are arguably basic, obvious, and standard that the C++ Standard Library just downright lacks.
That's as inefficient as bozosort - well, not quite, but.

OS-Specific:
windows: bool WINAPI SetEndOfFile(HANDLE hfile);
unix: int ftruncate(int fildes, off_tsize) <-- old C syntax.

both require closing the fstream and reopening.

meh.

I wonder, would they consider adding:

std::fstream &std::fstream::set_eof();
std::fstream &std::fstream::set_eof(std::streampos);

[EDIT]:
This was intended to be posted before the last poster but when I hit reply the 'net wouldn't connect - I logged on later and it autoposted, so this wasn't in reply to MaulingMonkey.



[Edited by - atetanat on August 7, 2007 4:30:21 AM]

This topic is closed to new replies.

Advertisement