Difference between revisions of "File Handling In Pascal"
Line 1: | Line 1: | ||
− | |||
− | |||
Something most programmers need to know how to do is work with files. Files can be used to save user settings, error logs, and more. Here i am going to teach you how to work with basic text files. | Something most programmers need to know how to do is work with files. Files can be used to save user settings, error logs, and more. Here i am going to teach you how to work with basic text files. | ||
− | + | =Old procedural style= | |
− | When using files in pascal, you can use a TextFile type, which allows you to write string into the file or create your own file type. | + | When using files in classic nonobjective pascal, you can use a TextFile type, which allows you to write string into the file or create your own file type. |
<Delphi> | <Delphi> | ||
Line 23: | Line 21: | ||
Since it is a compiler directive, you have to do this: | Since it is a compiler directive, you have to do this: | ||
<Delphi> | <Delphi> | ||
− | {$I-}//Turn off checking. This way all errors go into the IOResult variable | + | {$I-} // Turn off checking. This way all errors go into the IOResult variable |
− | {$I+}//Turn it back on | + | {$I+} // Turn it back on |
</Delphi> | </Delphi> | ||
− | By disabling (Turning off) IO it all goes into the IOResult variable. This is an cardinal type(Numbers). So, if you want to write it, you have to use the | + | By disabling (Turning off) IO it all goes into the IOResult variable. This is an cardinal type(Numbers). So, if you want to write it, you have to use the IntToStr function. Different numbers mean different errors. So you may want to check here for the different errors: [http://www.efg2.com/Lab/Library/Delphi/IO/IOResult.htm] |
==File procedures== | ==File procedures== | ||
− | + | These file handling procedures and functions are located in unit system. | |
− | '''Rewrite''' - | + | * '''Assign''' - Assign a name to a file |
+ | * '''Append''' - Opens an existing file for appending data to end of file and editing it | ||
+ | * '''BlockRead''' - Read data from an untyped file into memory | ||
+ | * '''BlockWrite''' - Write data from memory to an untyped file | ||
+ | * '''Close''' - Close opened file | ||
+ | * '''EOF''' - Check for end of file | ||
+ | * '''Erase''' - Erase file from disk | ||
+ | * '''FilePos''' - Get position in file | ||
+ | * '''FileSize''' - Get size of file | ||
+ | * '''Flush''' - Write file buffers to disk | ||
+ | * '''IOResult''' - Return result of last file IO operation | ||
+ | * '''Read''' - Read from a text file into variable | ||
+ | * '''ReadLn''' - Read from a text file into variable and goto next line | ||
+ | * '''Reset''' - Opens a file for reading | ||
+ | * '''Rewrite''' - Open file for writing | ||
+ | * '''Seek''' - Change position in file | ||
+ | * '''SeekEOF''' - Set file position to end of file | ||
+ | * '''SeekEOLn''' - Set file position to end of line | ||
+ | * '''Truncate''' - Truncate the file at position | ||
+ | * '''Write''' - Write variable to a text file | ||
+ | * '''WriteLn''' - Write variable to a text file and append newline | ||
− | |||
− | '' | + | [http://www.freepascal.org/docs-html/rtl/system/index-5.html Reference for unit 'System'] |
==Example== | ==Example== | ||
Line 136: | Line 153: | ||
It is possible to do some file handling using chars instead of strings. This makes it look cool :D. | It is possible to do some file handling using chars instead of strings. This makes it look cool :D. | ||
− | = | + | =Object style= |
− | |||
− | |||
− | |||
− | |||
Most of string handling classes have ability to load and save content from/to file. These methods are usually named SaveToFile and LoadFromFile. | Most of string handling classes have ability to load and save content from/to file. These methods are usually named SaveToFile and LoadFromFile. | ||
Line 146: | Line 159: | ||
==Binary files== | ==Binary files== | ||
+ | For opening files for direct access TFileStream should be used. This class is encapsulation for system procedures FileOpen, FileCreate, FileRead, FileWrite, FileSeek and FileClose which resides in unit FileUtil. This class is basically platform independent as these procedures have specific implementation for each platform. | ||
+ | |||
+ | [http://www.freepascal.org/docs-html/rtl/sysutils/ioroutines.html IO routines] | ||
<Delphi> | <Delphi> | ||
Line 160: | Line 176: | ||
end; | end; | ||
</Delphi> | </Delphi> | ||
+ | |||
+ | |||
+ | You can load entire file to memory too if it's size is comparatively smaller than available system memory. | ||
+ | |||
+ | <Delphi> | ||
+ | begin | ||
+ | with TMemoryStream.Create do | ||
+ | try | ||
+ | LoadFromFile('SomeTextFile.txt'); | ||
+ | Seek(0, soEnd); | ||
+ | Write(Ord('A'), 1); | ||
+ | SaveToFile('SomeTextFile.txt'); | ||
+ | finally | ||
+ | Free; | ||
+ | end; | ||
+ | end;</Delphi> | ||
+ | |||
==Text files== | ==Text files== |
Revision as of 07:41, 31 August 2010
Something most programmers need to know how to do is work with files. Files can be used to save user settings, error logs, and more. Here i am going to teach you how to work with basic text files.
Old procedural style
When using files in classic nonobjective pascal, you can use a TextFile type, which allows you to write string into the file or create your own file type.
<Delphi> ... type
TIntegerFile = file of Integer; // Allows you to write Integers into the file TPCharFile = file of PChar; // Write PChars into the file :\ TStringFile = file of string; // Write Strings into the file
... </Delphi>
If we only did TFile = File, then it would be impossible to write anything into it! Also, you cannot write integers directly into TFile, because it is a file of strings. Better use the filetype TextFile for writing values of different types.
IO
IO is the file handling thingy for pascal. It is used for getting errors. Since it is a compiler directive, you have to do this: <Delphi> {$I-} // Turn off checking. This way all errors go into the IOResult variable {$I+} // Turn it back on </Delphi>
By disabling (Turning off) IO it all goes into the IOResult variable. This is an cardinal type(Numbers). So, if you want to write it, you have to use the IntToStr function. Different numbers mean different errors. So you may want to check here for the different errors: [1]
File procedures
These file handling procedures and functions are located in unit system.
- Assign - Assign a name to a file
- Append - Opens an existing file for appending data to end of file and editing it
- BlockRead - Read data from an untyped file into memory
- BlockWrite - Write data from memory to an untyped file
- Close - Close opened file
- EOF - Check for end of file
- Erase - Erase file from disk
- FilePos - Get position in file
- FileSize - Get size of file
- Flush - Write file buffers to disk
- IOResult - Return result of last file IO operation
- Read - Read from a text file into variable
- ReadLn - Read from a text file into variable and goto next line
- Reset - Opens a file for reading
- Rewrite - Open file for writing
- Seek - Change position in file
- SeekEOF - Set file position to end of file
- SeekEOLn - Set file position to end of line
- Truncate - Truncate the file at position
- Write - Write variable to a text file
- WriteLn - Write variable to a text file and append newline
Example
A full example of handling a text file of type TextFile:
<Delphi> program FileTest;
{$mode objfpc} // Do not forget this ever
uses
Sysutils;
var
FileVar: TextFile;
begin
WriteLn('File Test'); AssignFile(FileVar, 'Test.txt'); // You do not have to put .txt but this is just for now {$I-} try Rewrite(FileVar); // creating the file Writeln(FileVar,'Hello'); except Writeln('ERROR! IORESULT: ' + IntToStr(IOResult)); end; CloseFile(FileVar); ReadLn;
end. </Delphi>
Now open the file in any text editor and you will see Hello written to it!
Heres appending to a file(Editing it)
<Delphi> program EditFile;
{$mode objfpc}
uses
Sysutils;
var
File1: TextFile;
begin
WriteLn('Append file'); AssignFile(File1, 'File.txt'); {$I-} try Append(File1, 'Some Text'); except Writeln('ERROR IORESULT:' + IntToStr(IOResult)); end; {$I+} CloseFile(File1); Readln;
end. </Delphi>
Reading a file:
<Delphi> program ReadFile;
{$mode objfpc}
uses
Sysutils;
var
File1: TextFile; Str: String;
begin
Writeln('File Reading:'); AssignFile(File1, 'File,txt'); {$I-} try Reset(File1); repeat Readln(File1, Str); // Reads the whole line from the file Writeln(Str); // Writes the line read until(EOF(File1)); // EOF(End Of File) The the program will keep reading new lines until there is none. except Writeln('ERROR IORESULT:', IOResult); end; {$I+} CloseFile(File1); Readln;
end. </Delphi>
It is possible to do some file handling using chars instead of strings. This makes it look cool :D.
Object style
Most of string handling classes have ability to load and save content from/to file. These methods are usually named SaveToFile and LoadFromFile.
Binary files
For opening files for direct access TFileStream should be used. This class is encapsulation for system procedures FileOpen, FileCreate, FileRead, FileWrite, FileSeek and FileClose which resides in unit FileUtil. This class is basically platform independent as these procedures have specific implementation for each platform.
<Delphi> var
Buffer: array[0..10000] of Byte;
begin
with TFileStream.Create('SomeTextFile', fmCreate) do try Seek(('Hello'); Write(Buffer, SizeOf(Buffer)); finally Free; end;
end; </Delphi>
You can load entire file to memory too if it's size is comparatively smaller than available system memory.
<Delphi> begin
with TMemoryStream.Create do try LoadFromFile('SomeTextFile.txt'); Seek(0, soEnd); Write(Ord('A'), 1); SaveToFile('SomeTextFile.txt'); finally Free; end;
end;</Delphi>
Text files
In general for text files you can use class TStringList for loading entire file to memory and have simple access their rows.
<Delphi> begin
with TStringList.Create do try Add('Hello'); SaveToFile('SomeTextFile.txt'); finally Free; end;
end; </Delphi>