Files

To work with a file, it must be opened first:

    fopen    L0, "file", "r";
    
Register "L0" contains the filenumber, the name is "file", and the mode
is read "r". Other modes are: "a" append and "w" write.

Close a file:

    fclose    L0;
	
To read from a file:

    fread_s    L0, string;
    
As you may have guessed "string" is a string variable and "L0" is the filenumber.


Opcodes

    L = long register, D = double register, BV = byte variable, SV = string variable
    

open/close

    fopen              L (file number), SV (name), SV (type);  opens a file
	
    types are:         "r"      read
                       "w"      write
                       "a"      append
                       "rw"     read/write
                       "wr"     write/read
                       "ar"     append/read

    fclose             L (file number);                        closes a file
	

read/write

    fread_b            L (file number), L;                   read byte
    fread_ab           L (file number), BV, L (length);      read byte array
    fread_i            L (file number), L;                   read int
    fread_l            L (file number), L;                   read lint
    fread_d            L (file number), D;                   read double
    fread_s            L (file number), SV, L (length);      read string
    fread_ls           L (file number), SV;                  read line

    fwrite_b           L (file number), L;                   write byte
    fwrite_ab          L (file number), BV, L (length);      write byte array
    fwrite_i           L (file number), L;                   write int
    fwrite_l           L (file number), L;                   write lint
    fwrite_d           L (file number), D;                   write double
    fwrite_s           L (file number), SV;                  write string

    fwrite_sl          L (file number), L;                   write lint as string
    fwrite_sd          L (file number), D;                   write double as string

    fwrite_n           L (file number), L;                   write "L" newlines
    fwrite_sp          L (file number), L;                   write "L" spaces
	

other

    fsetpos            L (file number), L;                   set stream position
    fgetpos            L (file number), L;                   get stream position

    frewind            L (file number);                      rewind stream
    fsize              L (file number), L;                   get file size in bytes

    fremove            L (file number), SV (name);           remove file
    frename            L (file number), SV (old), SV (new);  rename file
	
Here is an example:

        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

The "line feed" marks the end of a line in a textfile. The two chars to mark this are:
    CR (carriage return, ASCII code: 13)
    LF (line feed,       ASCII code: 10)
    
The terms "carriage return" and "line feed" are from the good old typewriter age.

Every operating system uses a different code:
    DOS, Windows:           CRLF
    Mac OS:                 CR
    Amiga OS, Unix, Linux:  LF
    ?:                      LFCR (Yes! Even this weird thing seems to be around!)
    
If we read a line with "fread_ls", nano takes care of all codes. It can handle all line feeds.
Writing a line feed with "fwrite_n" is different. We have to choose a code.
This can be done with some code like this:
    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;
    
This sets "_fnewline" to CRLF. The "fwrite_n" opcode uses CRLF now.
There is a default setting for "_fnewline". It's the host code.
On a windows machine "_fnewline" is set to CRLF, and so on.


binary files

There are two ways to store binary numbers in a file:
- little endian
- big endian

If we write the long int "76543" to a file, we get this hex code:

    little endian:  FF 2A 01 00
    big endian:     00 01 2A FF
    
The long int is four bytes long. Each number pair is one byte.
The difference is: "little endian" is the other way round as "big endian".

We have to know the endianess of a binary file, to read and write numbers.
Otherwise we would read and write false numbers.

The endianess is set by the variable "_fendian". An example:
    #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: Internal variables | Next: Files error codes