Mega Code Archive

 
Categories / Delphi / Files
 

Understanding what files are and choosing a delphi file type - part 3

Understanding what files are and choosing a Delphi file type - part 3 -------------------------------------------------------------------------------- What is a File? How are they stored? What format is best for my project? - The final part of a series by Philip Rayment -------------------------------------------------------------------------------- The final example uses a simple text file for storage: Example 3: Text File procedure WriteFile(filename:string); var fil: text; i: integer; begin {WriteFile} AssignFile(fil,filename); rewrite(fil);{Create the file} {Write the file version and number of records} Writeln(fil,LatestFileVersion,' ',length(People));[6] for i:=0 to high(people) do with people[i] do begin {Write the data} Writeln(fil,ChristianName); [6,10] Writeln(fil,Surname); [7,14] Writeln(fil,Address1); [21,9] Writeln(fil,Address2); [2,24] Writeln(fil,Town); [13,19] Writeln(fil,Postcode,' ',YearsService,' ',ID,' ',DateToStr(Birthdate)); [24,23] end; {with} CloseFile(fil); end; {WriteFile} procedure ReadFile(filename:string); var ver: byte; i, num: integer; d: string; begin {ReadFile} AssignFile(fil,filename); reset(fil); {Open the file} readln(fil,ver,num); {Read the version number and number of records} SetLength(people,num); for i:=0 to pred(num) do with people[i] do begin {Read the data} Readln(fil,ChristianName); Readln(fil,Surname); Readln(fil,Address1); Readln(fil,Address2); Readln(fil,Town); Readln(fil,Postcode,YearsService,ID,d); Birthdate:=StrToDate(d); end; {with} CloseFile(fil); end; {ReadFile} Analysis The total file size is 178 bytes, not much more than the untyped file. Delphi automatically converts the numbers to text, but we have to use the DateToStr function to convert the date to text. This table provides comparative statistics on the three examples: Untyped files Typed Files Text Files File size 143 bytes 342 bytes 178 bytes Bytes in "header" 3 114 6 Average bytes per record 70 114 86 Lines of code in WriteFile() 28 12 17 Estimate of speed Probably fairly fast, as no conversions were required, but there were many different calls to BlockWrite and several calls to a subroutine. Probably fastest, as just three separate writes to the disk were involved. Probably the slowest, due to all the conversions to text required. The Advantages and disadvantages of the various file types are as follows: Untyped Files Advantages You can store anything you wish in Untyped Files. There are no restrictions. Untyped Files will normally be the most compact Disadvantages You have to keep track of the data yourself, which will normally require a fair bit of coding. Typed Files Advantages Typed Files are easier to use than Untyped files. Typed Files are probably the fastest for most purposes as the data can be loaded straight into the record. The other types usually involve more conversions and/or data shuffling. Disadvantages You are limited to one type of data per file. Records have to be designed to hold the largest data (e.g. the longest possible name) and all records thus take up this space, so a Typed File is generally the most space hungry. It is pointless writing pointers to the file (if you did, you would simply write and read the memory address, not the data itself), so you cannot have file of pointers, objects, or strings (longstrings) or records containing any of these. In any case the compiler will not allow a file of string (longstring). Text Files Advantages Delphi has special facilities for handling Text Files, such as conversion of numerical data to text and vice versa, making Text Files easy to use and fairly compact. Text Files can be viewed in a text editor or even dumped to the screen (or printer) at the command prompt with the TYPE command. Corrupted files can be edited with a text editor. Disadvantages Non-textual data (other than numbers) cannot be included, unless somehow converted into a textual form. Not efficient storage of non-textual data. -------------------------------------------------------------------------------- Appendix A The following table compares how to code selected actions for various file types. Untyped files Typed Files Text Files Declaring var f: file; v: type; i: integer; var f: file of type; r: type; i: integer; var f: TextFile; i: integer; s: string; ch: char; Assigning AssignFile(f, filename) AssignFile (f, filename) AssignFile(f, filename); Opening for reading FileMode:=0; Reset(f, 1); FileMode:=0; Reset(f); Reset(f); Opening for reading and writing Reset(f, 1); Reset(f); Not available Opening for appending Reset(f, 1); Seek(f, filesize(f)); Reset(f); Seek(f, filesize(f)); Append(f); Creating Rewrite(f, 1); Rewrite(f); Rewrite(f); Reading BlockRead(f, v, sizeof(v)); Read(f, r); Read(f, i); Read(f, s); Readln(f, i, ch, s);(1) Skip a record/line while reading Seek(f, filepos(f)+sizeof(v)); Seek(f, succ(filepos(f))); Readln(f); (2) Writing BlockWrite(f, v, sizeof(v)); Write(f, r); Write(f, i); Write(f, s); Writeln(f, i, ‘ ‘, s); (1) Get the current file position i:=filepos(f); i:=filepos(f); Not available Jump to a position in the file Seek(f, i); Seek(f, i); Not available Get the file size i:=filesize(f); i:=filesize(f); Not available (3) Closing CloseFile(f); CloseFile(f); CloseFile(f); The Read, ReadLn, Write, and WriteLn procedures can take multiple arguments. If the ReadLn procedure has no parameters (other than the file variable), the file pointer merely moves to the end of the line. If the WriteLn procedure has no parameters (other than the file variable), a blank line is output. See the Tip How do I get the size of a Text File in Delphi? << Part 1 << Part 2 Part 3 © Philip Rayment 2002