#1
  1. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jun 2013
    Posts
    6
    Rep Power
    0

    C++ how to modify record in file


    Hi!

    I have a file account.dat within that data written in the format:

    1005199
    John
    Smith
    Address
    Z
    1000

    ,where the first line indicates the number of the user's account, and the last current balance on the account.
    I know how to read a line from a file and to write records in a file, but there should be some help on updating records, specifically, I want that if a user enters a new sum of money to update the file, that is to be updated last line of file.

    Any help is appreciated.
    Tnx
  2. #2
  3. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jan 2013
    Posts
    159
    Rep Power
    19
    You don't normally "update" a text file, you "re-create" the file with the modified information.

    Normally you read the information before the changes and write this information to a "temporary" file. Add the "updated" data, then continue reading the old information and write it to the "temporary" file as well. After you are finished, close then delete the old file and then rename the "temporary" file to the original file name.

    Jim
  4. #3
  5. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jun 2013
    Posts
    6
    Rep Power
    0
    Tnx Jim, Do you know a forum where they described a similar 'operations' ? :)
  6. #4
  7. Contributing User
    Devshed Supreme Being (6500+ posts)

    Join Date
    Jan 2003
    Location
    USA
    Posts
    7,175
    Rep Power
    2222
    I assume that account.dat is a text file, meaning that it's a concatenation of lines of text which are delimited by a new-line sequence (In Windows, carriage return-line feed, AKA "CRLF", AKA \x0d\x0a).

    If it's a normal text file, then you have variable-length records. In that case, just changing the balance would only work if the new value is exactly the same length as the old, which would be an unreasonable assumption.

    Now, if your file used fixed-length records, that would be different. You could define each field in each record to have a fixed length, a length great enough to hold the longest allowable value of each field. Then you could simply find the record of your choice, find the field you want to modify, and simply modify it. That is basically what database programs use.

    However, it appears that you are using variable-length records, so you would need to use the standard procedure for modifying a text file:

    1. Open the file for reading and open a second temporary file for writing; give the temporary file any name you want, just so long as it's unique.

    2. Search for the record to be modified by reading each record from account.dat and testing whether it's the one you want. If it's not, then write the record to the temporary file.

    3. When you find the record you want to modify, read each field into variables, modify the variables, and then write those variables to the temporary file.

    4. Write all the remaining records in account.dat into the temporary file using the same method you had used when searching for the record.

    5. Close both files. Delete account.dat (or rename it as a back-up copy). Rename the temporary file as "account.dat".


    Now, since you state that this is to be done in C++, I assume that your teacher wants you to use iostreams. My condolances.

    Of course, if account.dat becomes too large, then having to copy the entire file for each transaction could become time-consuming. If the records in account.dat do not need to be sorted, then you could employ a trick that dBASE used. You could open the file for read/write. When you find the record that you want to modify, read the fields into variables and modify the variables as before, but then you mark the record as invalid and then you append the modified record at the end of the file. If you want, you could also write a function that you would run occasionally to remove invalid records from the file, much like dBASE's PACK command.
  8. #5
  9. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jun 2013
    Posts
    6
    Rep Power
    0
    Yes, I use variable-length records.
    I'll stick to these 5 steps, because not that updated record only add to the end of the file :)
    Thank you very much for your help!
  10. #6
  11. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Jun 2013
    Posts
    6
    Rep Power
    0
    This 'algorithm' works, tnx!

IMN logo majestic logo threadwatch logo seochat tools logo