Operacje IO


Obsługa plików tekstowych

Plik tekstowy przechowuje zbiór łańcuchów znaków podzielonych na linie, odseparowane znakami CR (Carret Return: #13) i LF (Line Feed: #10).

Otwieranie

Pliki tekstowe można otwierać procedurami Rewrite, Reset i Append w zależności od sytuacji:

Zapis i odczyt

Dostęp do plików tekstowych jest sekwencyjny, tzn. aby odczytać konkretną informację umiejscowioną w konkretnej linii pliku tekstowego, trzeba odczytać wszystkie linie poprzedzające. Analogicznie traktowany jest zapis.

Zapis i odczyt realizują procedury standardowe:

Pierwszym parametrem jest zawsze zmienna plikowa. Kolejne parametry wymieniane po przecinku, specyfikują listę elementów zapisywanych/odczytywanych do/z pliku.

Przykład:

var f:TextFile;
    L:string;
    S5:string[5];
    z1,z2,z3,z4:Char;
begin
 AssignFile(f, 'c:\Ala.txt');
 Rewrite(f);                //otwarcie nowego pliku do zapisu           
 L:=''Ala ma kota'';
 Writeln(f,L);              //zapis łańcucha "Ala ma kota"
                            //jako pierwszej linii pliku
 Write(f, 'A kot');         //zapis łańcucha w drugiej linii
 Writeln(f,' ma Alę');      //zapis łańcucha jako kontynuacji 
                            //drugiej linii (zakończonej znakami CR/LF)
 WriteLn(f);                //zapis trzeciej, pustej linii 
                            //(czyli zapis znaków CR/LF)
 Writeln(f,'Ola ma ','psa');//zapis dwóch łańcuchów jako czwartej linii
 CloseFile(f);              //zamknięcie pliku  

W efekcie powstanie plik z zawartością:

Ala ma kota
A kot ma Alę

Ola ma psa

Ciąg dalszy przykładu:

 Reset(f);        //otwarcie pliku do odczytu
 ReadLn(f,L);     //odczyt pierwszej linii pliku do
                  //zmiennej L typu string
 Read(f,S5);      //odczyt pięciu znaków: "A kot" do
                  //zmiennej S5
 Readln(f,L);     //odczyt reszty linii jako zmiennej L
 ReadLn(f);       //odczyt kolejnej całej linii (trzeciej)
                  //bez jej zapamiętywania
 Read(f,z1);      //odczyt jednego znaku z czwartej linii
 Read(f,z2);      //odczyt kolejnego znaku z czwartej linii
 Read(f,z3);      //odczyt kolejnego znaku z czwartej linii
 Read(f,z4);      //odczyt kolejnego znaku z czwartej linii 
 CloseFile(f);    //zamknięcie pliku 
end;
Wartości numeryczne w plikach tekstowych

Nie ma potrzeby dokonywania konwersji wartości numerycznych na łańcuchowe przed ich zapisem do pliku tekstowego. Przykład

var X:Double;
    Y:Integer;
    f:TextFile;
begin
 AssignFile(f,'plik.txt');
 Rewrite(f);
 X := Sin(Pi/4);
 Y : =Random(99);
 Writeln(f,X);
 Writeln(f,Y);
 CloseFile(f);
end;

Powstanie plik z zapisem:

13
 7.07106781186548E-0001
 1.62754791419004E+0005

Można plik tekstowy z zapisanymi w nim liczbami odczytać w następujący sposób:

var A:array[1..3] of Double;
    i:Integer;
    f:TextFile;
begin
 AssignFile(f,'plik.txt');
 Reset(f);
 for i:=1 to 3 do 
  Read(f,a[i]);
 CloseFile(f);
end;

Procedura Read jest zdolna odczytać sekwencje znaków reprezentujące wartości numeryczne i konwertować te łańcuchy na wartości numeryczne, o ile są one odseparowane od innych sekwencji znakami tabulacji (#9), znakami spacji (#32) lub znakami CR/LF.

Formatowanie zapisów numerycznych

Można wpływać na format wartości numerycznych zapisywanych do pliku, bezpośrednio w procedurach Write, WriteLn, bez potrzeby odwoływania się do specjalistycznych funkcji formatujących. Należy użyć składni:

Writeln(f, WarReal:nZnakow:nPoPrzecinku);

gdzie:    nZnakow - specyfikuje liczbę znaków przeznaczonych na reprezentację wartości rzeczywistej WarReal,
nPoPrzecinku - oznacza liczbę znaków przeznaczonych na cyfry po miejscu dziesiętnym.

W przypadku nadmiaru wyspecyfikowanej ilości znaków - liczba zostanie uzupełniona wprowadzającymi spacjami, zaś w przypadku niedomiaru, procedura Write/WriteLn zapisze liczbę z minimalną ilością znaków potrzebną do niezafałszowanej reprezentacji liczby.

Wykonanie instrukcji:

var f:TextFile;
begin
 AssignFile(f,'d:\plik.txt');
 Rewrite(f);
 WriteLn(f,Pi);
 WriteLn(f,Pi:5:3);
 WriteLn(f,Pi:10:3);
 WriteLn(f,Pi:0:3);
 CloseFile(f);
end;

spowoduje utworzenie pliku z zawartością:

 3.14159265358979E+0000
3.142
     3.142
3.142