Streams (STL)

File Streams
The streams When a file is opened, an oject is created, and a stream is associated with the object. When   is included, the objects cout, cerr, clog, and cin are created. The streams associated with these objects provide communication channels between a program and a particular file or device.

Files and strings are examples of containers that you can both read from and write to. Concequently, you can have a stream that supports both < >. Such a stream is presented in  .

Reading and writing from an iostream is controlled through the //put-buffer// and //get-buffer// operations on the istream's streambuf.

To perform file processing, headers   and   must be included. Header fstream includes the definition for the stream class template basic_ifstream (for file input), basic_ofstream (for file output) and basic_fstream (for file input and output). Each class template has a predefined template specialization that enables char I/O. In addition, the fstream library provides typedef aliases for these template specializations. For example, the typedef ifstream represents a specialization of basic_ifstream that enables char input from a file. Similarly, typedef ofstream represents a specialization of basic_ofstream that enables char output to files. Also typedef fstream represent a specialization of basic_fstream that enables char input from, and output to, files.

Files are opened by creating objects of these stream template specializations. These templates derive from the class templates basic_istream, basic_ostream and basic_iostream so all member functions, operators and manipulators that belong to these templates can also be applied to file streams.

File-open Modes
^ Mode ^ Description ^
 * ios::app | //Append// all output to the end of the file. |
 * ios::ate | Open a file for output and move to the end of the file (normally used to append data to a file). Data can be written //anywhere// in the file. |
 * ios::in | Open a file for //input//. |
 * ios::out | Open a file for //output//. |
 * ios::trunc | //Discard// the file's contents (this also is the default action for ios::out). |
 * ios::binary | Open a file for binary, i.e., //nontext//, input or output. |

A file can be explicitly closed by calling close on its stream. However, this is implicitly done by the stream's destructor. So an explicit call of close is needed only if the file must be closed before reaching the end of the scope in which its stream was declared.

Feiltilstander i filbehandling
Biter definert i ios holder orden på tilstanden stream-objektet. Hver enkelt bit kan testes ved å sende en melding til stream-objektet.

^ Bit ^ Beskrivelse ^ Funksjon ^
 * eofbit | Settes etter at end-of-file er nådd. | EOF |
 * failbit | Settes dersom formatfeil oppstår, eksempel: en bokstav påtreffes når et tall forventes. Ved nøyaktig og omstendelig programmering vil det vanligvis være mulig å rette opp formatfeil. | fail |
 * badbit | Alvorlig feil som normalt må føre til at filbehandlingen avsluttes. | bad |
 * gooodbit | Alt ok | good |

Dersom et stream-objekt er satt i feiltilstand skal ikke innlesing påvirke innholdet i variabelen det leses inn til. Det gis imidlertid ingen feilmeldinger i denne situasjonen. Programmet kjører bare videre. Det vil si at derosm en feilbit er satt i et stream-objekt må denne fjernes før objektet kan brukes videre. Dette gjøres ved å sende meldingen clear til objektet. Eksempel:

Feilkontroll ved filbehandling er altså nødvendig, da det ellers ikke gis noen form for melding ved eventuelle feil. Strengt tatt bør en kontrollere hver eneste filoperasjon.

Filbehandling med unntakshåndtering:

Example: File Stream
The code copies one file to another. The file names are taken as command-line arguments.

A file is opened for input by creating an object of class ifstream with the file name as the argument. Similarly, a file is opened for output by creating an object of class ofstream with the file name as the argument. In both cases, we test the state of the created object to see if the file was successfully opened.

The following code writes to a sequential file:

Output:

The following code reads from a sequential file:

Output:

Open a file for input only (using ios::in) if the file's content should not be modified. This prevents unintentional modification of the file's contents and is another example of the principle of least privilege.

Å posisjonere filpekerne
istream og ostream tilbyr funksjoner for å posisjonere filpekerne. Enheten for å posisjonere filpekerne er en byte. Etter at den siste setningen er utført inneholder lengde størrelsen på filen i antall bytes, dvs. nummeret til den første posisjonen etter filslutt.

Binær overføring av data
Ved overføring av tall fra primærlageret tiil en tekstfil, skjer det en omforming fra binær form av tallet til ASCII-form av tallet. Tekststrenger, ligger lagret i primærlageret som ASCII-tegn. Tegnene trenger derfor ikke å omformes når de skrives til tekstfil eller leses fra tekstfil.

Objektfiler og kjørbare filer er eksempler på binærfiler. Det er også vanlig å lagre data på binærfiler. Programmet skriver da dataene direkte til filen uten formatering. Binærfiler lages ved å bruke følgende medlemsfunksjoner:

Adressen peker til char. Dersom startadresse er adressen til f.eks. en int, må vi caste denne til en adresse av char ved hjelp av reinterpret_cast:

String Streams
A stream can be attached to a string. That is, we can read from a string and write to a string using the formatting facilities provided by streams. Such streams are called a //stringstream// and are defined in  .

For example, an ostringstream can be used to format message strings:

An istringstream is an input stream reading from a string: