Dateien

Bevor man mit Dateien arbeiten kann, muss man sie zuerst öffnen:

    fopen    L0, "file", "r";
    
Register "L0" enthält die Dateinummer, der Name ist "file", und der Modus
ist read (lesen) "r". Andere sind: "a" append (anfügen) und "w" write (schreiben).

Datei schliessen:

    fclose    L0;
	
Von einer Datei lesen:

    fread_s    L0, string;
    
Wie du vielleicht schon gemerkt hast, "string" ist eine Stringvariable und "L0"
ist die Dateinummer.


Befehle

    L = long Register, D = double Register, BV = byte Variable, SV = string Variable
    

Öffnen/Schliessen

    fopen              L (Dateinummer), SV (Name), SV (Typ);   Datei öffnen
	
    types are:         "r"      read (lesen)
                       "w"      write (schreiben)
                       "a"      append (anfügen)
                       "rw"     read/write (lesen/schreiben)
                       "wr"     write/read (schreiben/lesen)
                       "ar"     append/read (anfügen/lesen)

    fclose             L (Dateinummer);                        Datei schliessen
	

lesen/schreiben

    fread_b            L (Dateinummer), L;                   lese byte
    fread_ab           L (Dateinummer), BV, L (Länge);       lese byte array
    fread_i            L (Dateinummer), L;                   lese int
    fread_l            L (Dateinummer), L;                   lese lint
    fread_d            L (Dateinummer), D;                   lese double
    fread_s            L (Dateinummer), SV, L (Länge);       lese string
    fread_ls           L (Dateinummer), SV;                  lese line

    fwrite_b           L (Dateinummer), L;                   schreibe byte
    fwrite_ab          L (Dateinummer), BV, L (Länge);       schreibe byte array
    fwrite_i           L (Dateinummer), L;                   schreibe int
    fwrite_l           L (Dateinummer), L;                   schreibe lint
    fwrite_d           L (Dateinummer), D;                   schreibe double
    fwrite_s           L (Dateinummer), SV;                  schreibe string

    fwrite_sl          L (Dateinummer), L;                   schreibe lint als String
    fwrite_sd          L (Dateinummer), D;                   schreibe double als String

    fwrite_n           L (Dateinummer), L;                   schreibe "L" neue Zeilen
    fwrite_sp          L (Dateinummer), L;                   schreibe "L" Leerzeichen
	

Sonstige

    fsetpos            L (Dateinummer), L;                   setze Dateiposition
    fgetpos            L (Dateinummer), L;                   gibt Dateiposition zurück

    frewind            L (Dateinummer);                      Datei auf Anfang setzen
    fsize              L (Dateinummer), L;                   gibt die Dateigrösse zurück

    fremove            L (Dateinummer), SV (Name);           Datei löschen
    frename            L (Dateinummer), SV (alt), SV (neu);  Datei umbenennen
	
Hier ist ein Beispiel:

        txtsave.na

     1| string file[256];
     2| string line[256];
     3|
     4| print_s    "file to save text? ";
     5| input_s    file;
     6|
     7| push_i     0, L0;
     8| fopen      L0, file, "w";
     9|
    10| push_i     1, L1;
    11| print_s    "Enter the text. Empty line to exit...";
    12| print_n    L1;
    13|
    14| lab input;
    15|     print_s   ": ";
    16|     input_s   line;
    17|     fwrite_s  L0, line;
    18|     fwrite_n  L0, L1;
    19|     neq_s     line, "", L2;
    20|     jmp_l     L2, input;
    21|
    22| fclose    L0;
    23| push_i    0, L0;
    24| exit      L0;
    

line feed (neue Zeile)

Der "line feed" markiert das Zeilenende in einer Textdatei.
Die zwei Zeichen, um das zu markieren sind:
    CR (carriage return, ASCII code: 13)
    LF (line feed,       ASCII code: 10)
    
Die Bezeichnungen "carriage return" und "line feed" sind aus der guten alten Schreibmaschinen Zeit.

Jedes Betriebssystem verwendet einen ander Code:
    DOS, Windows:           CRLF
    Mac OS:                 CR
    Amiga OS, Unix, Linux:  LF
    ?:                      LFCR (Ja! Sogar dieser seltsame soll im Umlauf sein!)
    
Wenn wir eine Zeile mit "fread_ls" lesen, kümmert sich Nano um alle Codes. Es kommt mit allen
line feeds zurecht. Einen line feed mit "fwrite_n" schreiben ist anders. Wir müssen einen Code wählen.
Das kann man mit einem Programmteil wie diesem:
    string cr[2];
    string lf[2];
    
    push_i          13, L0;
    char            L0, cr;
    push_i          10, L0;
    char            L0, lf;
    
    move_s          cr, _fnewline;
    add_s           _fnewline, lf, _fnewline;
    
Das setzt "_fnewline" auf CRLF. Der "fwrite_n" Befehl verwendet jetzt CRLF.
Es gibt eine Standardeinstellung für "_fnewline". Es ist der Code des Betriebssystems.
Bei einem Windows Rechner ist "_fnewline" auf CRLF gesetzt, etc.


Binärdateien

Es gibt zwei Arten Binärzahlen in einer Datei zu speichern:
- little endian
- big endian

Wenn wir die long Zahl "76543" in eine Datei speichern, bekommen wir diesen HEX Code:

    little endian:  FF 2A 01 00
    big endian:     00 01 2A FF
    
Die long Zahl ist vier Bytes lang. Jedes Nummernpaar ist ein Byte
Der Unterschied ist: "little endian" ist andersrum als "big endian".

Wir müssen den Endian Typ einer Datei kennen, um Zahlen lesen und schreiben
zu können. Sonst würden wir falsche Zahlen lesen und schreiben.

Der Endian Typ wird mit der Variablen "_fendian" gesetzt. Ein Beispiel:
    #include <file.nah>

    #setreg_l       L0, null;
    #setreg_l       L1, file;
    #setreg_l       L2, n;
    #setreg_l       L3, endian;

    push_i          0, null;
    push_i          0, file;
    push_l          76543L, n;
    
    push_i          ENDIAN_BIG, endian;
    pull_i          endian, _fendian;

    fopen           file, "big_endian", "w";
    fwrite_l        file, n;
    fclose          file;
    
    exit            null;
    
Prev: Interne Variablen | Next: Dateien Fehlercodes