Datoteke z naključnim dostopom so takšne, kjer lahko do posameznih zapisov datoteke dostopamo neposredno. Pri datotekah z naključnim dostopom uporabljamo datotečne kazalce. Za določanje datotečnega kazalca uporabimo metodi seekp in seekg. Trenutni položaj kazalca pa dobimo z metodama tellg() in tellp().
//Tvorjenje datoteke z naključnim dostopom
#include <iostream>
#include <fstream.h>
using namespace std;
struct Podatki_stranke {
int stev_rac;
char priimek[15];
char ime[10];
float stanje;
};
main()
{
ofstream izh_racuni("racuni.dat", ios::ate);
if (!izh_racuni) {
cerr << "Zbirke ni moc odpreti." << endl;
exit(1);
}
cout << "Vnesi stevilko racuna "
<< "(med 1 in 100, 0 za konec vnosa)" << endl << "? ";
Podatki_stranke stranka;
cin >> stranka.stev_rac;
while (stranka.stev_rac > 0 && stranka.stev_rac <= 100) {
cout << "Vnesi priimek, ime in stanje" << endl << "? ";
cin >> stranka.priimek >> stranka.ime >> stranka.stanje;
izh_racuni.seekp((stranka.stev_rac - 1) * sizeof(Podatki_stranke));
izh_racuni.write((char *)&stranka, sizeof(Podatki_stranke));
cout << "Vnesi stevilko racuna" << endl << "? ";
cin >> stranka.stev_rac;
}
return 0;
}
Branje iz datoteke z naključnim dostopom
#include <iostream>
#include <iomanip.h>
#include <fstream.h>
#include <stdlib.h>
using namespace std;
struct Podatki_stranke {
int stev_rac;
char priimek[15];
char ime[10];
float stanje;
};
void izpisi_vrsto(ostream &output, Podatki_stranke s)
{
output << s.stev_rac << ", " << s.priimek << ", " << s.ime << ", " << s.stanje << endl;
}
main()
{
ifstream vho_racuni("racuni.dat", ios::in);
if (!vho_racuni) {
cerr << "Zbirke ni moc odpreti." << endl;
exit(1);
}
cout << "Priimek, " << "Ime, " << "Stanje" << endl;
Podatki_stranke stranka;
vho_racuni.read((char *)&stranka, sizeof(Podatki_stranke));
while (!vho_racuni.eof()) {
if (stranka.stev_rac != 0)
izpisi_vrsto(cout, stranka);
vho_racuni.read((char *)&stranka, sizeof(Podatki_stranke));
}
return 0;
}
Program poizveduje po datoteki, v kateri so shranjeni podatki o računih. Poizvedujemo lahko po računih, ki imajo kritje, po računih z ničelnim stanjem in po računih z dolgom.
#include <iostream>
#include <fstream.h>
#include <iomanip.h>
#include <stdlib.h>
using namespace std;
void izpisi_vrsto(int rac, char *priimek, float stan)
{
cout << rac << ", " << priimek << ", " << stan << endl;
}
main()
{
ifstream vho_zbirka_strank("stranke.dat", ios::in);
if (!vho_zbirka_strank) {
cerr << "Zbirke ni moc odpreti" << endl;
exit(1);
}
cout << "Vnesi zahtevo" << endl
<< " 1 - Izpisi racune z nicelnim stanjem" << endl
<< " 2 - Izpisi racune z dolgom" << endl
<< " 3 - Izpisi racune s kritjem" << endl
<< " 4 - Konec izvajanja" << endl << "? ";
int zahteva;
cin >> zahteva;
Poizvedovanje po različnih stanjih računov
while (zahteva != 4) {
int racun;
char priimek[10];
float stanje;
switch (zahteva) {
case 1:
cout << endl << "Racuni z nicelnim stanjem:" << endl;
while (vho_zbirka_strank >> racun >> priimek >> stanje)
if (stanje == 0)
izpisi_vrsto(racun, priimek, stanje);
break;
Poizvedovanje po različnih stanjih računov
case 2:
cout << endl << "Racuni z dolgom:" << endl;
while (vho_zbirka_strank >> racun >> priimek >> stanje)
if (stanje < 0)
izpisi_vrsto(racun, priimek, stanje);
break;
case 3:
cout << endl << "Racuni s kritjem:" << endl;
while (vho_zbirka_strank >> racun >> priimek >> stanje)
if (stanje > 0)
izpisi_vrsto(racun, priimek, stanje);
break;
}
vho_zbirka_strank.clear(); // zbrisi eof za naslednji vnos
vho_zbirka_strank.seekg(0); // nastavi na zacetek zbirke
cout << endl << "? ";
cin >> zahteva;
}
cout << "Konec izvajanja." << endl;
return 0;
}