Re: Discarding contexts of a text file starting from an offset



Richard Heathfield <r...@xxxxxxxxxxxxxxx> wrote:
parthaspand...@xxxxxxxxx said:
How can I get to discard the contents of a text file
from a specified offset(say, obtained from ftell)?

If you just mean that you don't want to read any more from
that file, then don't read any more from that file.

If you want to delete the contents of the file from a
specified point onwards, there is no standard function to
do that (although implementation-specific functions are
sometimes provided by library implementors), but there is
a standard *technique* to do it, which is very simple:

Simple to state, perhaps...

* open the existing file for input
* open a new file for output

What do you call this new file?

The obvious solution is to use a temp file, either via tmpnam
or tmpfile. The trouble is, many implementations will create
a temp file/name in a different directory from the file being
read.

This has consequences in a later step...

* if both those operations succeeded
* read from input all the data you want to keep,
and write it to the output (checking, of course,
that both reading and writing proceed correctly)
* close both files, checking that these operations
succeeded
* if all is still well
* delete the old file using remove()
* rename() the new file so that it takes the old name

Some versions of rename() do not allow you to rename across
disk drives, or other 'barriers'. If the temp file is not on
the same... um...'plane' as the original, the rename can fail.

That's it. Since this operation destroys data unrecoverably,
make sure at every step that all is well before proceeding
to the next step. Remember that, right up until the remove()
call, it's still possible to change your mind. After that,
you have no (standard) way to recover the data.

Other than offering to rewrite the temp file to a location of
the user's choice (and hoping it will succeed.)

There are other alternatives, though nothing perfect.

If the file in question is one that you've 'opened' for the
user, then many programs will immediately make a copy of it
and edit the copy, precisely so they can 'save' back over the
original file name and simply delete the copy.

Another option is to try the rename first, before copying.
If the rename fails, then you've saved time copying!

Perhaps the least robust in standard terms, but most robust
in practical terms, is to generate your own temp file name
simply by adding (say) '.tmp' to end of the name of the
original file.

--
Peter

.



Relevant Pages

  • Re: Change File Content
    ... > Writting the file that you are reading is fine ONLY IF you will no change ... > delete the original file and rename the temp file. ... Rename new_file to old_file. ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: vb application locks file
    ... Make a temp file, ... My email processors, for example, create their message files in a temp folder, ... complete writing the data, close the file, then "rename" it to a target directory. ...
    (microsoft.public.vb.general.discussion)
  • Re: trouble with msconfig.exe
    ... The original file has been renamed to msconfig.old (I don't know the ... msconfig.exe directly from Windows installation CD-Rom (it's Windows XP ... I can't rename or delete msconfig.old. ... Be sure the machine is clean first: ...
    (microsoft.public.windowsxp.general)
  • Re: lots of _RBLDAxxxx after table rebuilt
    ... The rebuild utility does not rename the original file until the ... rename that rebuild does after it rebuilds the file. ... Just do like the rebuild utility would do and delete the original ...
    (comp.databases.btrieve)
  • Re: How can I do a 100% bullet proof Save?
    ... original file is left with the wrong name. ... of failure - namely the final rename. ... to rename the original file back to its original file name, ... fails. ...
    (microsoft.public.vc.mfc)