  
  [1X8. Examples of usage[0X
  
  For larger examples see the [11Xexample[0X directory of the package. You find there
  a  small  server  using  the  TCP/IP protocol and a corresponding client and
  another small server using the UDP protocol and a corresponding client.
  
  Further,  there  is an example for the usage of [10XFile[0X objects, that read from
  or write to strings.
  
  Another  example  there  shows  starting up a child process and piping a few
  megabytes through it using [2XIO_Popen2[0X ([14X4.4-4[0X).
  
  In  the following, we present a few explicit, interactive short examples for
  the  usage  of the functions in this package. Note that you have to load the
  [5XIO[0X package with the command [10XLoadPackage("IO");[0X before trying these examples.
  
  
  [1X8.1 Writing and reading a file[0X
  
  The  following  sequence  of commands opens a file with name [11Xguck[0X and writes
  some things to it:
  
  [4X-----------------------------  Log  ------------------------------[0X
    [4Xgap> f := IO_File("guck","w");[0X
    [4X<file fd=3 wbufsize=65536 wdata=0>[0X
    [4Xgap> IO_Write(f,"Hello world\n");[0X
    [4X12[0X
    [4Xgap> IO_WriteLine(f,"Hello world2!");[0X
    [4X14[0X
    [4Xgap> IO_Write(f,12345);[0X
    [4X5[0X
    [4Xgap> IO_Flush(f);[0X
    [4Xtrue[0X
    [4Xgap> IO_Close(f);[0X
    [4Xtrue[0X
  [4X------------------------------------------------------------------[0X
  
  There  is  nothing  special  about  this,  the  numbers are numbers of bytes
  written.  Note  that  only  after  the [2XIO_Flush[0X ([14X4.2-10[0X) command the data is
  actually written to disk. Before that, it resides in the write buffer of the
  file. Note further, that the [2XIO_Flush[0X ([14X4.2-10[0X) call here would not have been
  necessary, since the [2XIO_Close[0X ([14X4.2-16[0X) call flushes the buffer anyway.
  
  The file can again be read with the following sequence of commands:
  
  [4X-----------------------------  Log  ------------------------------[0X
    [4Xgap> f := IO_File("guck","r");[0X
    [4X<file fd=3 rbufsize=65536 rpos=1 rdata=0>[0X
    [4Xgap> IO_Read(f,10);[0X
    [4X"Hello worl"[0X
    [4Xgap> IO_ReadLine(f);[0X
    [4X"d\n"[0X
    [4Xgap> IO_ReadLine(f);[0X
    [4X"Hello world2!\n"[0X
    [4Xgap> IO_ReadLine(f);[0X
    [4X"12345"[0X
    [4Xgap> IO_ReadLine(f);[0X
    [4X""[0X
    [4Xgap> IO_Close(f);[0X
    [4Xtrue[0X
  [4X------------------------------------------------------------------[0X
  
  Note  here  that  reading  line-wise  can  only be done efficiently by using
  buffered  I/O.  You  can  mix  calls  to  [2XIO_Read[0X ([14X4.2-6[0X) and to [2XIO_ReadLine[0X
  ([14X4.2-3[0X).  The end of file is indicated by an empty string returned by one of
  the read functions.
  
  
  [1X8.2 Using filtering programs to read and write files[0X
  
  If you want to write a big amount of data to file you might want to compress
  it  on  the fly without using much disk space. This can be achieved with the
  following command:
  
  [4X-----------------------------  Log  ------------------------------[0X
    [4Xgap> s := "";; for i in [1..10000] do Append(s,String(i)); od;;[0X
    [4Xgap> Length(s);[0X
    [4X38894[0X
    [4Xgap> IO_FileFilterString("guck.gz",[["gzip",["-9c"]]],s);[0X
    [4Xtrue[0X
    [4Xgap> sgz := StringFile("guck.gz");;[0X
    [4Xgap> Length(sgz);[0X
    [4X18541[0X
    [4Xgap> ss := IO_StringFilterFile([["gzip",["-dc"]]],"guck.gz");;[0X
    [4Xgap> s=ss;[0X
    [4Xtrue[0X
  [4X------------------------------------------------------------------[0X
  
  This  sequence  of commands needs that the program [11Xgzip[0X is installed on your
  system.
  
  
  [1X8.3 Using filters when reading or writing files sequentially[0X
  
  If  you  want  to process bigger amounts of data you might not want to store
  all  of  it  in a single [5XGAP[0X string. In that case you might want to access a
  file on disk sequentially through a filter:
  
  [4X-----------------------------  Log  ------------------------------[0X
    [4Xgap> f := IO_FilteredFile([["gzip",["-9c"]]],"guck.gz","w");[0X
    [4X<file fd=5 wbufsize=65536 wdata=0>[0X
    [4Xgap> IO_Write(f,"Hello world!\n");[0X
    [4X13[0X
    [4Xgap> IO_Write(f,Elements(SymmetricGroup(5)),"\n");[0X
    [4X1359[0X
    [4Xgap> IO_Close(f);[0X
    [4Xtrue[0X
    [4Xgap> f := IO_FilteredFile([["gzip",["-dc"]]],"guck.gz","r");[0X
    [4X<file fd=4 rbufsize=65536 rpos=1 rdata=0>[0X
    [4Xgap> IO_ReadLine(f);[0X
    [4X"Hello world!\n"[0X
    [4Xgap> s := IO_ReadLine(f);; Length(s);[0X
    [4X1359[0X
    [4Xgap> IO_Read(f,10);                  [0X
    [4X""[0X
    [4Xgap> IO_Close(f);[0X
    [4Xtrue[0X
  [4X------------------------------------------------------------------[0X
  
  
  [1X8.4 Accessing a web page[0X
  
  The  [5XIO[0X package has an HTTP client implementation. Using this you can access
  web pages and other web downloads from within [5XGAP[0X. Here is an example:
  
  [4X-----------------------------  Log  ------------------------------[0X
    [4Xgap> r := SingleHTTPRequest("www.math.rwth-aachen.de",80,"GET",[0X
    [4X>              "/~Max.Neunhoeffer/index.html",rec(),false,false);;[0X
    [4Xgap> RecFields(r);[0X
    [4X[ "protoversion", "statuscode", "status", "header", "body", "closed" ][0X
    [4Xgap> r.status;[0X
    [4X"OK"[0X
    [4Xgap> r.statuscode;[0X
    [4X200[0X
    [4Xgap> r.header;[0X
    [4Xrec( date := "Thu, 07 Dec 2006 22:08:22 GMT", [0X
    [4X  server := "Apache/2.0.55 (Ubuntu)", [0X
    [4X  last-modified := "Thu, 16 Nov 2006 00:21:44 GMT", [0X
    [4X  etag := "\"2179cf-11a5-3c77f600\"", accept-ranges := "bytes", [0X
    [4X  content-length := "4517", content-type := "text/html; charset=ISO-8859-1" )[0X
    [4Xgap> Length(r.body);[0X
    [4X4517[0X
  [4X------------------------------------------------------------------[0X
  
  Of course, the time stamps and exact sizes of the answer may differ when you
  do this.
  
  
  [1X8.5 (Un-)Pickling[0X
  
  Assume  you  have  some  [5XGAP[0X  objects  you  want  to archive to disk grouped
  together. Then you might do the following:
  
  [4X-----------------------------  Log  ------------------------------[0X
    [4Xgap> r := rec( a := 1, b := "Max", c := [1,2,3] );[0X
    [4Xrec( a := 1, b := "Max", c := [ 1, 2, 3 ] )[0X
    [4Xgap> r.c[4] := r;[0X
    [4Xrec( a := 1, b := "Max", c := [ 1, 2, 3, ~ ] )[0X
    [4Xgap> f := IO_File("guck","w");[0X
    [4X<file fd=3 wbufsize=65536 wdata=0>[0X
    [4Xgap> IO_Pickle(f,r);[0X
    [4XIO_OK[0X
    [4Xgap> IO_Pickle(f,[(1,2,3,4),(3,4)]);[0X
    [4XIO_OK[0X
    [4Xgap> IO_Close(f);[0X
    [4Xtrue[0X
  [4X------------------------------------------------------------------[0X
  
  Then, to read it in again, just do:
  
  [4X-----------------------------  Log  ------------------------------[0X
    [4Xgap> f := IO_File("guck");[0X
    [4X<file fd=3 rbufsize=65536 rpos=1 rdata=0>[0X
    [4Xgap> IO_Unpickle(f);[0X
    [4Xrec( a := 1, b := "Max", c := [ 1, 2, 3, ~ ] )[0X
    [4Xgap> IO_Unpickle(f);[0X
    [4X[ (1,2,3,4), (3,4) ][0X
    [4Xgap> IO_Unpickle(f);[0X
    [4XIO_Nothing[0X
    [4Xgap> IO_Close(f);[0X
    [4Xtrue[0X
  [4X------------------------------------------------------------------[0X
  
  Note that this works for a certain amount of builtin objects. If you want to
  archive  your  own  objects  or  more  sophisticated objects you have to use
  extend  the functionality as explained in Section [14X5.3[0X. However, it works for
  lists and records and they may be arbitrarily self-referential.
  
