Un stream este un obiect care contine si formateaza octeti. Exista diverse tipuri de streamuri de intrare si de iesire:
Manipulatorii definiti in <iomanip> actioneaza asupra unui stream: flush, endl, ends, hex, oct, dec, ws,...
Un stream poate fi testat pentru erori cu metodele good(), bad(), fail(), clear() si eof() sau inspectand bitii eofbit, failbit (probleme ce nu afecteaza buffer-ul stream-ului) si badbit(buffer compromis).
Low-level, se pot citi si scrie octeti intr-un stream cu read() si write().
High-level, o linie se poate citi cu functiile membru get() si getline(), care au ca parametru adresa unui buffer, dimensiunea acestuia si caracterul delimitator (uzual, '\n'). Spre deosebire de getline(), get() nu extrage caracterul delimitator din flux; un apel get() fara parametri extrage urmatorul caracter.

Exemplul 1:

#include <fstream>
#include <iostream>
int main(){
const int sz=100;
char buf[sz];
{
  ifstream in("strfile.cpp"); //constructorul apeleaza metoda open()
  ofstream out("strfile.out");
  int i=1; //line counter
  while (in.get(buf, sz)){ //lasa '\n' in input
	in.get(); //elimina urmatorul caracter, adica '\n'
	cout << buf << endl;
	out << i++ << ": " << buf << endl;
  }
}//destructorii inchid in si out apeland metoda close()

ifstream in("strfile.out");
while (in.getline(buf, sz)){
	char* cp = buf;
	while (*cp != ':') cp++;
	cp+=2; //se trece de ": "
	cout << cp << endl;
}
}
Metodele open() si close() se pot apela si direct. Un apel get() fara parametru poate fi inlocuit cu un apel al metodei ignore() (care poseda 2 argumente: numarul de caractere peste care se sare (implicit 1) si caracterul la care se opreste fortat (implicit EOF)).
Modul de deschidere al unui fisier se controleaza cu:
Pozitionarea intr-un stream se poate realiza relativ (cu ios::beg, ios::cur, ios::end) sau absolut (cu tellp(), seekp() pt. ostream si tellg(), seekg() pt. istream). Pozitionarea in cin si cout are rezultate nedefinite!

Orice obiect iostream contine un pointer la un obiect de tipul streambuf; acest pointer se obtine cu metoda rdbuf(). De exemplu:

ifstream in("strfile.cpp");
cout << in.rdbuf(); //afiseaza continutul fisierului
while (in.get(*cout.rdbuf())) in.ignore() //afiseaza continutul fisierului
Acesta forma a lui get() scrie direct in streambuffer-ul, receptionat ca parametru, al altui obiect!

Exemplul 2:

ifstream in("strfile.cpp");
in.seekg(0, ios::end); //pozitionare la sfarsitul fisierului
streampos sp1 = in.tellg(); //dimensiunea fisierului
cout << "file size:" << sp << endl;
in.seekg(-sp/10, ios::end);
streampos sp2 = in.tellg();
in.seekg(0, ios::beg); //inceputul fisierului
cout << in.rdbuf(); //afiseaza continutul fisierului
in.seekg(sp2);
cout << in.rdbuf(); //afiseaza ultima zecime a fisierului
Exemplul 3: fisiere simultan in citire/scriere

ifstream in("iofile", ios::in|ios::out); //ios::in previne trunchierea!
ostream out(in.rdbuf()); //pointerul de scriere este pozitionat la sfarsitul fisierului
cout << in.rdbuf(); //afiseaza continutul fisierului
out << "Where does this end up?"; //la sfarsitul fisierului
out.seekp(0, ios::beg);
out << "And what about this?";    //suprascrie la inceputul fisierului!
in.seekg(0, ios::beg);
cout << in.rdbuf(); //afiseaza continutul fisierului