2008. január 26., szombat

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


Problem/Question/Abstract:

What is a File? How are they stored? What format is best for my project? - The final part of a series by Philip Rayment

Answer:

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
write(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"?

Nincsenek megjegyzések:

Megjegyzés küldése