Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 273
  • Last Modified:

Remove record from tfilestream

How to do that?

Imagine I have 30 records and I wish to remove the 4th

Another thing... Is there any quicksort function for that? If possible, tell me how to use it with the file stream... (I'll give extra 50 points)

thanks
0
jpcs
Asked:
jpcs
  • 4
  • 2
  • 2
  • +1
1 Solution
 
TheNeilCommented:
I don't think you can do it directly (I'm guessing here) but what about running through your data and copy the records that you need into a second file stream?

The Neil
0
 
LischkeCommented:
Simple answers are: no and no.

More complete answers are:

1) In order to remove a record from a file you would need to move up the part of the file which is behind a specific position. This is not supported by the OS so you have first to make a memory representation of the file (e.b. by writing the records you wanna keep into a memory stream) and then overwrite the existing file with this memory representation.

2) As the physical backup of a file stream is the file itself you cannot directly sort (or move, for that matter) a part. You also have to make a memory representation, sort this and write it back.

The professional answer is you would need in both cases to do an external merge sort or replacment sort which are algortithms described in "Algorithm in C++" written by Robert Sedgewick (ISBN 3-89319-462-2). Sorry, it would be too expensive to describe them here, but the book is really good (even if the samples are written in C++).

Ciao, Mike
0
 
jpcsAuthor Commented:
Thanks for the comments.

My idea is to do as I used to before...

for i := record_pos to filesize div sizeof(filedata) do
begin
   read the next record;
   go back one position;
   write next record on curr pos;
end;
truncate last record.


It worked, and I'm still trying to make it, but I'm having some problems since it's the first time I'm using streamfiles


thanks
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LischkeCommented:
Well, what you are actually doing is the naive approach to the external merging I mentioned in my last comment. For the case where you just want to remove a record I suggest that you have a closer look at TStream.CopyFrom.

What you actually can use is two have two streams (source and target). You need to open both and copy from the soure:

  TargetStream.CopyFrom(SourceStream, NumberBytesToFirstRecordToSkip);

where the position of both streams is at start of course 0. Now set

  SourceStream.Position := BytePositionAfterRecordsToSkip;

and finally:
  Target.CopyFrom(SourceStream, AnyLargeNumberOrLessForMoreToSkip);

This way, you can avoid touching each and every single record, but can move large parts, which results in faster operation.

Ciao, Mike
0
 
LischkeCommented:
Forgot to mention: The disadvantage is obvious. You need a temporary file to hold the target stuff. On the other hand this approach takes the burden from the memory to hold potentially large data blocks.

Ciao, Mike
0
 
arcrottyCommented:
my 2 cents...

Open old file

rename old file to *.bak

create new file

copy data in one large chunk to the position of the file you want to remove.

Advance the position of the old file by the length of the record you want to remove.

Copy the remaining data from old to the new file.

close files

delete *.bak file

0
 
arcrottyCommented:
null
0
 
LischkeCommented:
That's exactly the same principle I suggested. The only difference is that you directly work with files, while I suggested streams. But otherwise... the same idea.

jpcs,

will you now accept and grade a comment or are you still looking for another solution? Some reaction from you would be great. Keep in mind, WE are solving YOUR problem, not vice versa.

Ciao, Mike
0
 
jpcsAuthor Commented:
Well I've already solved my problem with the way I suggested... I was doing all right but with a little problem (sizeof(record)+1) instead of (sizeof (record))+1... so it was adding one to the size and not working well...

This may not the the best way, but has the file will not have many record, it's ok


Sorry for the delay, but as I had solved my problem a long time ago, I forgot to accept the comment. Today, the emails remembered me.


regards
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 4
  • 2
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now