[fpc-pascal] Seek with text file
James Richters
james at productionautomation.net
Tue Apr 3 12:03:00 CEST 2018
I am trying to figure out how I can remove the last line of a text file to replace it with a new one. I can do this with typed files with seek... but I am confused on how I could do this with just a text file.
If I use:
Var Myfile: Text;
Mydata:String;
Assign(myfile,'test.txt');
append(myfile);
Writeln(myfile,'New Line'+mydata);
Close(myfile);
I can write to the end of the file, but I can't use seek to go to the end of the file minus one line.
If I try
Var Myfile: file of Text;
Mydata:String;
Assign(myfile,'test.txt');
Reset(myfile);
Seek(myfile,FILESIZE(myfile)-1);
Writeln(myfile,'New Line'+mydata);
Close(myfile);
I cannot use writeln with typed files....
so I tried with write...
Var Myfile: file of Text;
Mydata:String;
Assign(myfile,'test.txt');
Reset(myfile);
Seek(myfile,FILESIZE(myfile)-1);
Write(myfile,'New Line'+mydata);
Close(myfile);
I get Error: Incompatible types: got "ShortString" expected "Text"
So then I tried
Var Myfile: file of String;
Mydata:String;
Assign(myfile,'test.txt');
Reset(myfile);
Seek(myfile,FILESIZE(myfile)-1);
Write(myfile,'New Line'+mydata);
Close(myfile);
Well that compiles, but when I run it the new line at the end of my file is what I wanted but followed by whole long line of garbage... some of it looks like the contents of memory that was not part of the string. I'm guessing it attached a string of length 255 even though the string was not that long.
Can someone please help me understand this. I really have no concept of the difference between 'text' and 'string' The file I am trying to work with is just a regular text file like you would create with notepad.. Is there some way to open this file and use Seek to get to the line number I want? It seems to me like the file is very well defined, a CRLF at the end of each line defines how long each line is, it seems like I would be able to seek X number of these records... but I can't figure out how to define it... or write just the part of the string with my actual data in it.
If I can't use seek then what do I do? Open it, reset it, then read the entire file except the last line then somehow then write my new line?
Or do I have to read the whole file into a buffer or something, make my change, then write the whole thing out again?
More information about the fpc-pascal
mailing list