| Časová náročnost: 15 minut |
I/O funkce nejnižší úrovně jsou
get() a
put(). Funkce
get() čte byt a funkce
put() byt zapisuje. Nejpoužívanější syntaxe jsou uvedeny zde:
istream &get(char &ch);
ostraam &put(char ch);
Funkce
get() čte jednotlivé znaky z proudu a vkládá je do
ch. Funkce
put() zapisuje
ch do proudu a vrací odkaz na proud.
Pro čtení nebo zápis bloku dat do proudu se použijí funkce
read() nebo
write() s následující syntaxí:
istream &read(char *buf, streamsize počet);
ostream &write(const char *buf, streamsize počet);
Funkce
read() čte daný počet bytů z vyvolaného proudu a vkládá je do vyrovnávací paměti (bufferu) odkazovaného přes
buf. Funkce
write() zapisuje daný počet bytů z vyrovnávací paměti odkazované přes
buf do proudu. Typ
streamsize je forma integer. Objekt typu
streamsize je schopen pojmout největší počet bytů předávaných v jakékoliv I/O operaci.
Jestliže bylo dosaženo konce před tím, než byl přečten daný počet znaků, pak prostě funkce
read() přestane číst a ve vyrovnávací paměti bude tolik znaků, kolik bylo přečteno. K tomu, abychom zjistili kolik znaků bylo přečteno můžeme použít funkci
gcount().
streamsize gcount();
V následujícím příkladu si ukážeme jak vytvářet jednoduchý binární soubor a zapisovat do něj data. Název souboru je zadán jako argument příkazové řády.
| Příklad 8.2. |
|
#include <iostream.h>
#include <fstream.h>
int main(int argc, char *argv[])
{
char ch;
if(argc!=2) {
cout << "Zadejte: 8_2 nazev souboru\n";
return 1;
}
ofstream out(argv[1], ios::out | ios::binary);
if(!out) {
cout << "Nelze otevrit soubor\n";
return 1;
}
cout << "Pro ukonceni zadejte $\n";
do {
cin.get(ch);
out.put(ch);
} while (ch!='$');
out.close();
return 0;
}
|
Následující program vypíše obsah souboru.
| Příklad 8.3. |
|
#include <iostream.h>
#include <fstream.h>
int main(int argc, char *argv[])
{
char ch;
if(argc!=2) {
cout << "Zadejte: 8_3 nazev souboru\n";
return 1;
}
ifstream in(argv[1], ios::in | ios::binary);
if(!in) {
cout << "Nelze otevrit soubor\n";
return 1;
}
while(!in.eof()) {
in.get(ch);
cout << ch;
}
in.close();
return 0;
}
|
Mimo výše uvedených formátů funkcí
get() a
put() je možné i tyto funkce přetížit a to následujícím způsobem:
istream &get(char *buf, streamsize počet);
istream &get(char *buf, streamsize počte, char oddělovač);
int get();
První formát načítá do pole znaky dle ukazatele
buf, pokud není přetečen buď počtem znaků
počet-1, nebo se nenarazí na konec řádku, nebo na konec souboru. Jestliže se ve vstupním proudu objeví znak nového řádku
není přijat. Zůstává v proudu až do další vstupní operace.
Druhý formát čte znaky z pole dle ukazatele
buf, pokud není přečten počet znaků
počet-1, nebo se nenarazí na znak určený
oddělovačem nebo se nenarazí na konec souboru.Jestliže se ve vstupním proudu objeví znak oddělovače
není přijat. Zůstává v proudu až do další vstupní operace.
Třetí formát vrací vždy následující znak z proudu. Při dosažení konce vrací EOF.