E-gradiva > Računalništvo > Programiranje > Načrtovanje in razvoj programskih aplikacij > Vhodno-Izhodni tokovi > Podatkovne zbirke > Datoteke z naključnim dostopom

Prijava

Datoteke z naključnim dostopom

 

 

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().

 

Primer:

 

  1. //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;
    }

  2. 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.

 

 

  1. #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;
    }