Discarding contexts of a text file starting from an offset

Discussion in 'C Programming' started by parthaspanda22@gmail.com, Nov 5, 2007.

  1. Guest

    How can I get to discard the contents of a text file from a specified
    offset(
    say, obtained from ftell)?

    Sincerely.
    , Nov 5, 2007
    #1
    1. Advertising

  2. santosh Guest

    On Monday 05 Nov 2007 12:54 pm
    wrote in
    <>:

    > How can I get to discard the contents of a text file from a specified
    > offset( say, obtained from ftell)?
    >
    > Sincerely.


    One method is to copy the relevant portion to another file, close the
    first one and rename the second file to the name of the first one.
    Another method could be to fill the unneeded portions with zero. One
    more method is to read the relevant portion into memory, close the file
    then open it again with the "w" mode and write your buffer out to it.
    santosh, Nov 5, 2007
    #2
    1. Advertising

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

    * open the existing file for input
    * open a new file for output
    * 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

    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.

    --
    Richard Heathfield <http://www.cpax.org.uk>
    Email: -http://www. +rjh@
    Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
    "Usenet is a strange place" - dmr 29 July 1999
    Richard Heathfield, Nov 5, 2007
    #3
  4. Richard Bos Guest

    wrote:

    > How can I get to discard the contents of a text file from a specified
    > offset( say, obtained from ftell)?


    You can read the FAQ: <http://c-faq.com/osdep/ftruncate.html>.

    Richard
    Richard Bos, Nov 5, 2007
    #4
  5. On Sun, 04 Nov 2007 23:24:16 -0800, wrote:

    >How can I get to discard the contents of a text file from a specified
    >offset(
    >say, obtained from ftell)?


    The portable way is to copy the file up to the desired point, delete
    the original, and rename the copy.


    Remove del for email
    Barry Schwarz, Nov 6, 2007
    #5
  6. Richard Heathfield <> wrote:
    > 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
    Peter Nilsson, Nov 6, 2007
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Lance Riedel

    Translated Offset to Source Offset

    Lance Riedel, Oct 14, 2003, in forum: XML
    Replies:
    2
    Views:
    485
    Patrick TJ McPhee
    Oct 15, 2003
  2. Army1987

    Discarding unread data after scanf()

    Army1987, Mar 25, 2007, in forum: C Programming
    Replies:
    8
    Views:
    523
    Peter Shaggy Haywood
    Mar 28, 2007
  3. Replies:
    3
    Views:
    315
    Malcolm McLean
    Nov 28, 2007
  4. Roedy Green

    Discarding CDs and DVDs

    Roedy Green, Sep 15, 2008, in forum: Java
    Replies:
    8
    Views:
    442
    RedGrittyBrick
    Sep 16, 2008
  5. Roy Smith
    Replies:
    4
    Views:
    240
    Roy Smith
    Jan 27, 2013
Loading...

Share This Page