# Darbas su duomenų failais

# Apie darbą su duomenų failais

  • Norint nuskaityti informaciją iš failo arba išvesti informaciją į failą, reikės susikurti norimos krypties srauto operatorių, atsidaryti failą, atlikti nuskaitymo ar įrašymo veiksmus ir uždaryti failą.
  • Nuskaitymas ar išvedimas į failą bus labai panašus į nuskaitymą ar išvedimą į konsolę, kuomet teko naudoti cin ir cout, vienintelis skirtumas - jūs susikursite savo srauto operatorių ir naudosite jį.
  • Su tuo pačiu failu vienu metu galite atlikti tik nuskaitymo arba išvedimo veiksmą.

# Naudojama biblioteka

Norint nuskaityti informaciją iš failo ar išvesti ką nors į failą, bus reikalinga fstream biblioteka:

#include <fstream>

# Sintaksė

Norint nuskaityti kažką iš failo arba kažką išvesti į failą, reikės susikurti atititinkamo tipo srauto operatorių, atsidaryti failą. O toliau, šių operatorių naudojimas yra toks pats kaip cout ir cin naudojimas dirbant su informacija iš ar į konsolę.

Nuskaitymo iš failo srauto operatoriaus kūrimas:

ifstream nuskaitymo_srautas;

Išvedimo į failą srauto operatoriaus kūrimas:

ofstream isvedimo_srautas;

Failo atsidarymas:

srauto_operatorius.open("failas.txt");

Failo uždarymas:

srauto_operatorius.close();

Galima naudoti ir trumpesnę sintaksę. Srauto operatoriaus sukūrimas ir failo atsidarymas darbui:

// failas nuskaitymui
ifstream operatorius("failas.txt");

// failas išvedimui
ofstream operatorius("failas.txt");

# Informacijos nuskaitymas iš failo

# Apie informacijos nuskaitymą iš failo

  • Norint nuskaityti informaciją iš failo, reikės susikurti nuskaitymo srauto operatorių, atsidaryti failą, atlikti nuskaitymo veiksmus ir uždaryti failą.
  • Nuskaitymui naudosite susikurtą srauto operatorių ir jį galėsite naudoti taip pat kaip naudojot cin. Taip pat, nuskaitymui bus galima naudoti getline() bei .get() komandas.

# Nuskaitymo būdai

Nuskaitymas iš failo yra labai panašus nuskaitymo iš konsolės atveju. Todėl siūlome platesnės informacijos apie nuskaitymo būdus ir kitus niuansus paieškoti skyriuje Informacijos nuskaitymas iš konsolės (opens new window).

# Sintaksė

Nuskaitymo iš failo srauto operatoriaus kūrimas:

ifstream operatorius;
  • ifstream - komanda, parodanti, kad kuriate nuskaitymo iš failo operatorių.
  • operatorius - jūsų sugalvotas operatoriaus pavadinimas, kurį naudosite norint nuskaityti duomenis iš failo.

Failo atsidarymas:

operatorius.open("failo_pavadinimas.txt");

Taip pat, galima susikurti norimą nuskaitymo operatorių ir atsidaryti failą nuskaitymui vienoje eilutėje:

ifstream operatorius("failo_pavadinimas.txt");
  • ifstream - komanda, parodanti, kad kuriate nuskaitymo iš failo operatorių.
  • operatorius - jūsų sugalvotas operatoriaus pavadinimas, kurį naudosite norint nuskaityti duomenis iš failo.
  • failo_pavadinimas.txt - failas, kurį atidarote nuskaitymui.

Duomenų nuskaitymas iš failo, analogiškas cin nuskaitymui iš konsolės:

int kintamasis;
operatorius >> kintamasis;

Duomenų nuskaitymas iš failo, pasinaudojant getline():

string tekstas;

// eilutės nuskaitymas
getline(operatorius, kintamasis);

// eilutės nuskaitymas iki simbolio (šiuo atveju - kablelio)
getline(operatorius, kintamasis, ',');

Duomenų nuskaitymas iš failo, pasinaudojant cin.get():

char simboliai[20];

// Nuskaitoma 20 simbolių į char masyvą
operatorius.get(simboliai, 20);

Patikrinimas ar jau failo pabaiga buvo pasiekta (grąžina true jei jau pasiekta failo pabaiga ir false - jei dar ne failo pabaiga):

operatorius.eof(); // end of file

Failo uždarymas:

operatorius.close();

# Pavyzdžiai 1 (paprastas nuskaitymas)

# Pavyzdys 1

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    int skaicius1, skaicius2, skaicius3;

    // nuskaitymo pasiruošimas
    ifstream nuskaitymas;

    // failo atsidarymas
    nuskaitymas.open("duomenys.txt");

    // nuskaitymas
    nuskaitymas >> skaicius1 >> skaicius2 >> skaicius3;

    // failo uždarymas
    nuskaitymas.close();

    // veiksmai su nuskaitytais duomenimis
    cout << "Faile esantys skaiciai:" << endl << skaicius1 << endl
        << skaicius2 << endl << skaicius3 << endl;
    cout << "Siu skaiciu suma: " << skaicius1 + skaicius2 + skaicius3 << endl;

    return 0;
}
5 4 8

Rezultatai:

Faile esantys skaiciai:
5
4
8
Siu skaiciu suma: 17

# Pavyzdys 2

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims
    string vardas, pavarde;
    int amzius;
    double ugis;

    // srauto operatoriaus sukūrimas ir failo atidarymas
    ifstream failas("duomenys.txt");

    // failo nuskaitymas
    failas >> vardas >> pavarde >> amzius >> ugis;

    // išvedimas į konsolę
    cout << vardas << " " << pavarde << " (" << amzius
        << " m.), jo ugis " << ugis << " m." << endl;

    // failo uždarymas
    failas.close();

    return 0;
}
Tomas Tomauskas 25 1.8

Rezultatai:

Tomas Tomauskas (25 m.), jo ugis 1.8 m.

# Pavyzdys 3

Kodas:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    string pavadinimas1, pavadinimas2;
    int metai1, metai2, puslapiai1, puslapiai2;
    double kaina1, kaina2;

    // srauto operatoriaus sukūrimas ir failo atsidarymas
    ifstream duomenys("duomenys.txt");

    // failo nuskaitymas

    getline(duomenys, pavadinimas1);
    duomenys >> metai1 >> puslapiai1 >> kaina1;

    duomenys >> ws;
    
    getline(duomenys, pavadinimas2);
    duomenys >> metai2 >> puslapiai2 >> kaina2;

    // failo uždarymas
    duomenys.close();

    // kiti veiksmai

    cout << "PIRMA KNYGA" << endl;
    cout << "Pavadinimas: " << pavadinimas1 << endl;
    cout << "Metai: " << metai1 << endl;
    cout << "Puslapiai: " << puslapiai1 << endl;
    cout << "Kaina: " << kaina1 << " eur.\n\n";

    cout << "ANTRA KNYGA" << endl;
    cout << "Pavadinimas: " << pavadinimas2 << endl;
    cout << "Metai: " << metai2 << endl;
    cout << "Puslapiai: " << puslapiai2 << endl;
    cout << "Kaina: " << kaina2 << " eur.\n";

    return 0;
}
Haris Poteris ir Azkabano kalinys
2005 200 19.99
7 efektyviai veikianciu zmoniu iprociai
2018 180 12.99

Rezultatai:

PIRMA KNYGA
Pavadinimas: Haris Poteris ir Azkabano kalinys
Metai: 2005
Puslapiai: 200
Kaina: 19.99 eur.

ANTRA KNYGA
Pavadinimas: 7 efektyviai veikianciu zmoniu iprociai
Metai: 2018
Puslapiai: 180
Kaina: 12.99 eur.

# Pavyzdys 4

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    int skaiciai[5];
    int kiekis = 5;

    // srauto operatoriaus sukūrimas ir failo atsidarymas
    ifstream duomenys("duomenys.txt");

    // failo nuskaitymas
    duomenys >> skaiciai[0] >> skaiciai[1]
        >> skaiciai[2] >> skaiciai[3] >> skaiciai[4];

    // failo uždarymas
    duomenys.close();

    // kiti veiksmai

    cout << "Nuskaityti skaiciai: ";
    int suma = 0;

    for (int i = 0; i < kiekis; i++)
    {
        cout << skaiciai[i] << " ";
        suma += skaiciai[i];
    }

    cout << endl;
    cout << "Skaiciu suma: " << suma << endl;

    return 0;
}
8
9
5
7
4

Rezultatai:

Nuskaityti skaiciai: 8 9 5 7 4
Skaiciu suma: 33

# Pavyzdys 5

Kodas:

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    string vardai[4];
    int amziai[4];
    int kiekis = 4;

    // srauto operatoriaus sukūrimas ir failo atsidarymas
    ifstream fin("duomenys.txt");

    // failo nuskaitymas
    for (int i = 0; i < kiekis; i++)
    {
        fin >> vardai[i] >> amziai[i];
    }

    // failo uždarymas
    fin.close();

    // kiti veiksmai

    cout << "Vardai       Amziai\n\n";

    for (int i = 0; i < kiekis; i++)
    {
        cout << setw(12) << left << vardai[i]
            << " " << setw(6) << amziai[i] << endl;
    }
    
    return 0;
}
Tomas 23
Gintaras 24
Greta 26
Gintare 23

Rezultatai:

Vardai       Amziai

Tomas        23
Gintaras     24
Greta        26
Gintare      23

# Pavyzdys 6

Kodas:

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    string vardai[4];
    int amziai[4];
    int kiekis = 4;

    // srauto operatoriaus sukūrimas ir failo atsidarymas
    ifstream fin("duomenys.txt");

    // failo nuskaitymas
    for (int i = 0; i < kiekis; i++)
    {
        char laikinas[16];
        fin.get(laikinas, 16);
        vardai[i] = laikinas;
        fin >> amziai[i];
        fin >> ws;
    }

    // failo uždarymas
    fin.close();

    // kiti veiksmai

    cout << "Vardai           Amziai\n\n";

    for (int i = 0; i < kiekis; i++)
    {
        cout << setw(16) << left << vardai[i]
            << " " << setw(6) << amziai[i] << endl;
    }
    
    return 0;
}
Tomas Tomauskas 23
Gintaras        24
Greta           26
Gintare         23

Rezultatai:

Vardai           Amziai

Tomas Tomauskas  23
Gintaras         24
Greta            26
Gintare          23

# Pavyzdys 7

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    int skaiciai[5];
    int kiek = 5;

    // srauto operatoriaus sukūrimas ir failo atsidarymas
    ifstream fin("duomenys.txt");

    // failo nuskaitymas
    for (int i = 0; i < kiek; i++)
    {
        fin >> skaiciai[i];
    }

    // failo uždarymas
    fin.close();

    cout << "Skaiciai: ";

    for (int i = 0; i < kiek; i++)
    {
        cout << skaiciai[i] << " ";
    }
    
    return 0;
}
8
9
5
4
5
3
1
5
8
7

Rezultatai:

Skaiciai: 8 9 5 4 5

# Užduotys 1 (paprastas nuskaitymas)

# Užduotis 1

Duomenų failo turinys:

Tomas 19 KTU 8

Šiame faile esanti informacija:

  • Pirmas žodis ("Tomas") - studento vardas.
  • Antras skaičius ("19") - studento amžius.
  • Trečias žodis ("KTU") - aukštosios mokyklos, kurioje mokosi studentas trumpinys.
  • Ketvirtas skaičius ("8") - studento vidurkis.

Nuskaitykite šią informaciją, bei ją išveskite į ekraną norimo sakinio forma, pavyzdžiui:

Studentas Tomas (19 m.) mokosi KTU, jo vidurkis - 8.

Taip pat išveskite ar studento vidurkis yra teigiamas ar neigiamas skaičius.

Pamėginkite pakeitinėti duomenų failą, ištestuokite ar programa veikia korektiškai su kitokiais duomenimis (kurie iš formato atitinka dabar nurodytus).

# Užduotis 2

Duomenų failo turinys:

Tomas 1.9 19
Ugnius 2.0 20
Giedrius 1.8 21

Kiekvienoje failo eilutėje pateikiami duomenys apie tris krepšininkus:

  • Vardas.
  • Ūgis, metrais.
  • Amžius.

Nuskaitykite šiuos duomenis iš failo.

Nuskaitytus duomenis išveskite konsolėje lentelės pavidalu.

Raskite, kuris krepšininkas yra vyriausias, bei kuris krepšininkas yra aukščiausias.

# Užduotis 3

Faile esantis turinys:

3 5 8 7 9 6

Nuskaitykite šiuos duomenis iš failo.

Išveskite nuskaitytą informaciją norima forma į konsolę.

Raskite, skaičių sumą, vidurkį, bei didžiausią ir mažiausią skaičius.

# Užduotis 4

Faile esantis turinys:

Liepa         5.2 12
Obelis        2.9 10
Berželis      7.8 8

Kiekvienoje failo eilutėje saugoma tokia informacija apie medžius:

  • Pavadinimas.
  • Aukštis, metrais.
  • Amžius, metais.

Atkreipkite dėmesį, kad pavadinimas užima atitinkamą kiekį simbolių.

Nuskaitykite šią informaciją iš failo.

Išveskite nuskaitytą informaciją lentelės pavidalu į konsolę.

Raskite kiek yra medžių, kurių amžius yra lygus daugiau nei 10 metų.

# Užduotis 5

Faile esantis turinys:

Audi, A4, 2005 1.6 321021

Faile esanti informacija apie automobilį:

  • Automobilio markė.
  • Automobilio modelis.
  • Gamybos metai.
  • Darbinis tūris, l.
  • Rida, km.

Atkreipkite dėmesį, kad po markės ir modelio yra dedamas kablelis, kadangi markę ir / ar modelį gali sudaryti keli žodžiai, todėl nuskaitymas turi būti atliktas iki kablelio.

Nuskaitykite šią informaciją iš failo.

Išveskite nuskaitytą informaciją apie automobilį į konsolę.

Vartotojui leiskite konsolės pagalba suvesti dabartinius metus.

Paskaičiuokite:

  • Automobilio amžių (dabartiniai metai - gamybos metai).
  • Kiek vidutiniškai kilometrų automobilis nuvažiavęs kiekvienais metais?

# Pavyzdžiai 2 (kai žinoma kiek duomenų)

# Pavyzdys 8

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    int skaiciai[5];
    int kiek;

    // srauto operatoriaus sukūrimas ir failo atsidarymas
    ifstream duomenys("duomenys.txt");
    
    // kiekio nuskaitymas
    duomenys >> kiek;

    // failo nuskaitymas
    for (int i = 0; i < kiek; i++)
    {
        duomenys >> skaiciai[i];
    }

    // failo uždarymas
    duomenys.close();

    // kiti veiksmai

    cout << "Skaiciu faile: " << kiek << endl;

    cout << "Skaiciai: ";

    for (int i = 0; i < kiek; i++)
    {
        cout << skaiciai[i] << ", ";
    }

    return 0;
}
3
45
89
56

Rezultatai:

Skaiciu faile: 3
Skaiciai: 45, 89, 56,

# Pavyzdys 9

Kodas:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    string vardai[10];
    int kiek;

    // srauto operatoriaus sukūrimas ir failo atsidarymas
    ifstream duomenys("duomenys.txt");

    // kiekio nuskaitymas
    duomenys >> kiek;

    // failo nuskaitymas
    for (int i = 0; i < kiek; i++)
    {
        duomenys >> vardai[i];
    }

    // failo uždarymas
    duomenys.close();

    // kiti veiksmai

    for (int i = 0; i < kiek; i++)
    {
        cout << vardai[i] << ", ";
    }

    return 0;
}
4
Tomas
Greta
Paulius
Inga

Rezultatai:

Tomas, Greta, Paulius, Inga,

# Pavyzdys 10

Kodas:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    string vardai[10];
    int amziai[10];
    int kiek;

    // srauto operatoriaus sukūrimas ir failo atsidarymas
    ifstream duomenys("duomenys.txt");

    // kiekio nuskaitymas
    duomenys >> kiek;

    // failo nuskaitymas
    for (int i = 0; i < kiek; i++)
    {
        duomenys >> vardai[i] >> amziai[i] >> ws;
    }

    // failo uždarymas
    duomenys.close();

    // kiti veiksmai

    for (int i = 0; i < kiek; i++)
    {
        cout << vardai[i] << " (" << amziai[i] << " m.)" << endl;
    }

    return 0;
}
4
Tomas 23
Greta 24
Paulius 22
Inga 22

Rezultatai:

Tomas (23 m.)
Greta (24 m.)
Paulius (22 m.)
Inga (22 m.)

# Užduotys 2 (kai žinoma kiek duomenų)

# Užduotis 6

Faile esantis turinys:

4
Kaunas
Vilnius
Klaipeda
Panevezys

Pirmoje failo eilutėje yra skaičius, kiek miestų yra šiame faile. Sekančioje failo eilutėje yra miestų pavadinimai.

Nuskaitykite šiuos duomenis iš failo.

Išveskite nuskaitytus duomenis konsolėje, norima forma.

Prie kiekvieno miesto nurodykite iš kiek raidžių yra sudarytas jo pavadinimas.

# Užduotis 7

Faile esantis turinys:

8
5 8 7 4 3 5 4 8

Failo pirmoje eilutėje yra nurodytas pažymių kiekis. Sekančioje eilutėje yra nurodytas atitinkamas kiekis pažymių.

Nuskaitykite šią informaciją iš failo.

Paskaičiuokite nuskaitytų pažymių vidurkį.

Išveskite nuskaitytus pažymius ir gautą vidurkį į konsolę.

# Užduotis 8

Faile esantis turinys:

4
Frontend programuotojas, 3
Backend programuotojas, 4
Dizaineris, 2
Projektu vadovas, 1

Failo pirmoje eilutėje yra nurodyta kiek įrašų apie komandos narius yra šiame faile.

Sekančioje eilutėse yra saugoma informacija apie komandą:

  • Pareigų pavadinimas.
  • Kiek yra žmonių, užimančių nurodytas pareigas.

Atkreipkite dėmesį, kad pareigų pavadinimas tęsiasi iki kablelio, nes pavadinimas gali būti sudarytas iš kelių žodžių.

Nuskaitykite šią informaciją iš failo.

Išveskite nuskaitytą informaciją į konsolę lentelės pavidalu.

# Užduotis 9

Faile esantis turinys:

4
Frontend programuotojas  3
Backend programuotojas   4
Dizaineris               2
Projektu vadovas         1

Failo pirmoje eilutėje yra nurodyta kiek įrašų apie komandos narius yra šiame faile.

Sekančioje eilutėse yra saugoma informacija apie komandą:

  • Pareigų pavadinimas.
  • Kiek yra žmonių, užimančių nurodytas pareigas.

Atkreipkite dėmesį, kad pareigų pavadinimui yra naudojamas atitinkamas kiekis simbolių, todėl nuskaityme reikės nuskaityti atitinkamą kiekį simbolių.

Nuskaitykite šią informaciją iš failo.

Išveskite nuskaitytą informaciją į konsolę lentelės pavidalu.

# Užduotis 10 (sudėtingesnė)

Faile esantis turinys:

Tomas 5 8 6 9 8 4
Gintare 3 8 4 9

Kiekvienoje failo eilutėje yra informacija apie studentus:

  • Pirmoje vietoje - studento(-ės) vardas.
  • Antro vietoje - kiek pažymių turi studentas(-ė).
  • Trečioje vietoje ir toliau - studento(-ės) pažymiai.

Nuskaitykite šią informaciją iš failo.

Išveskite nuskaitytą informaciją į konsolę norima forma.

Raskite, kurio studento(-ės) pažymių vidurkis didesnis.

# Pavyzdžiai 3 (kai nežinoma kiek duomenų)

# Pavyzdys 11

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    int skaiciai[10];
    int kiek = 0;

    // srauto operatoriaus sukūrimas ir failo atsidarymas
    ifstream duomenys("duomenys.txt");

    // failo nuskaitymas
    while (!duomenys.eof())
    {
        duomenys >> skaiciai[kiek];
        kiek++;
    }

    // failo uždarymas
    duomenys.close();

    // kiti veiksmai

    cout << "Nuskaityti skaiciai: ";
    int suma = 0;

    for (int i = 0; i < kiek; i++)
    {
        cout << skaiciai[i] << " ";
        suma += skaiciai[i];
    }

    cout << "\nSiu skaiciu suma: " << suma << endl;
    cout << "Vidurkis: " << (double)suma / kiek << endl;

    return 0;
}
2
5
6
5
4
2
3
1
5

Rezultatai:

Nuskaityti skaiciai: 2 5 6 5 4 2 3 1 5
Siu skaiciu suma: 33
Vidurkis: 3.66667

# Pavyzdys 12

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    string vardai[10];
    int kiek = 0;

    // srauto operatoriaus sukūrimas ir failo atsidarymas
    ifstream duomenys("duomenys.txt");

    // failo nuskaitymas
    while (!duomenys.eof())
    {
        duomenys >> vardai[kiek];
        kiek++;
    }

    // failo uždarymas
    duomenys.close();

    // kiti veiksmai

    cout << "Nuskaityti vardai: ";

    for (int i = 0; i < kiek; i++)
    {
        cout << vardai[i] << ", ";
    }

    return 0;
}
Ignas
Tomas
Giedrius

Rezultatai:

Nuskaityti vardai: Ignas, Tomas, Giedrius,

# Pavyzdys 13

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    // kintamieji duomenims saugoti
    string vardai[10];
    int amziai[10];
    int kiek = 0;

    // srauto operatoriaus sukūrimas ir failo atsidarymas
    ifstream failas("duomenys.txt");

    // failo nuskaitymas
    while (!failas.eof())
    {
        failas >> vardai[kiek];
        failas >> amziai[kiek];
        kiek++;
    }

    // failo uždarymas
    failas.close();

    // kiti veiksmai

    for (int i = 0; i < kiek; i++)
    {
        cout << vardai[i] << " (" << amziai[i]
            << " m.)" << endl;
    }

    return 0;
}
Ignas 20
Tomas 23
Giedrius 22

Rezultatai:

Ignas (20 m.)
Tomas (23 m.)
Giedrius (22 m.)

# Užduotys 3 (kai nežinoma kiek duomenų)

# Užduotis 11

Faile esanti informacija:

8 9 7 4 5 3 1 2 5 4 8 7 4 5 3 2 1 5

Nuskaitykite šią informaciją iš failo.

Raskite šių skaičių sumą, vidurkį, mažiausią skaičių, didžiausią skaičių.

Nuskaitytus duomenis ir gautus atsakymus išveskite į konsolę.

Papildomai: pamėginkite skaičius surikiuoti didėjimo tvarka ir išveskite į konsolę.

# Užduotis 12

Faile esanti informacija:

Kate
Suo
Gyvate
Dramblys
Zirafa
Vilkas

Faile saugoma informacija apie gyvūnus.

Nuskaitykite šią informaciją.

Norima forma išveskite konsolės ekrane nuskaitytus duomenis, šalia kiekvieno gyvūno nurodant eilės numerį, kelintas tai gyvūnas (1-as, 2-as, ...).

# Užduotis 13

Faile esanti informacija:

Piestukas, 0.99
Kreideles crayon, 1.99
Sasiuvinys 50 psl., 1.49

Kiekvienoje failo eilutėje yra ši informacija apie prekes:

  • Prekės pavadinimas.
  • Kaina, eurais.

Atkreipkite dėmesį į tai kad prekės pavadinimas yra nurodomas iki kablelio, kadangi pavadinimą gali sudaryti ne vienas žodis.

Nuskaitykite šią informaciją iš failo.

Išveskite nuskaitytą informaciją į konsolę lentelės pavidalu.

Raskite kuri prekė yra pigiausia ir kuri brangiausia.

# Užduotis 14

Faile esanti informacija:

Piestukas            0.99
Kreideles crayon     1.99
Sasiuvinys 50 psl.   1.49

Kiekvienoje failo eilutėje yra ši informacija apie prekes:

  • Prekės pavadinimas.
  • Kaina, eurais.

Atkreipkite dėmesį į tai kad prekės pavadinimas užima atitinkamą kiekį simbolių, kadangi pavadinimą gali sudaryti ne vienas žodis.

Nuskaitykite šią informaciją iš failo.

Išveskite nuskaitytą informaciją į konsolę lentelės pavidalu.

Raskite kuri prekė yra pigiausia ir kuri brangiausia.

# Užduotis 15 (sudėtingesnė)

Faile esanti informacija:

Giedrius 6 5 4 8 9 4 7
Paulina 5 7 8 9 6 8
Inga 6 8 7 9 6 5 4
Tomas 5 6 5 8 7 9

Kiekvienoje failo eilutėje saugoma ši informacija apie studentus(-es):

  • Pirmoje vietoje - studento(-ės) vardas.
  • Antro vietoje - kiek pažymių studentas(-ė) turi.
  • Trečioje vietoje ir sekančiose - studento(-ės) pažymiai.

Nuskaitykite šią informaciją iš failo.

Paskaičiuokite kiekvieno studento(-ės) pažymių vidurkį.

Į konsolę išveskite studento(-ės) vardą ir pažymių vidurkį.

# Informacijos išvedimas į failą

# Apie informacijos išvedimą į failą

  • Norint išvesti informaciją į failą, reikės susikurti išvedimo srauto operatorių, atsidaryti failą, atlikti išvedimo veiksmus ir uždaryti failą.
  • Išvedimui naudosite susikurtą srauto operatorių ir jį galėsite naudoti taip pat kaip naudojot cout.

# Sintaksė

Išvedimo į failą operatoriaus pasiruošimas:

ofstream operatorius;
  • ofstream - komanda, parodanti, kad kuriate išvedimo į failą operatorių.
  • operatorius - jūsų sugalvotas operatoriaus pavadinimas, kurį naudosite norint išvesti duomenis į failą.

Failo atsidarymas:

operatorius.open("failo_pavadinimas.txt");

Taip pat, galima susikurti norimą išvedimo operatorių ir atsidaryti failą išvedimui vienoje eilutėje:

ofstream operatorius("failo_pavadinimas.txt");
  • ofstream - komanda, parodanti, kad kuriate išvedimo į failą operatorių.
  • operatorius - jūsų sugalvotas operatoriaus pavadinimas, kurį naudosite norint išvesti duomenis į failą.
  • failo_pavadinimas.txt - failas, kurį atidarote išvedimui.

Duomenų išvedimas į failą, analogiškas cout išvedimui į konsolę:

operatorius << "tekstas";

Failo uždarymas:

operatorius.close();

# Failo papildymas

Atsidarant failą rašymui, jis būna išvalomas ir yra rašomas iš naujo. Norint tęsti išvedimą į anksčiau pradėtą failą, jį atsidarant galima panaudoti ios:app:

ofstream operatorius("failas.txt", ios::app);

# Teksto formatavimas

Tam tikriems teksto formatavimo dalykams bus naudojama ši biblioteka:

#include <iomanip>

Teksto formatavimo komandos naudojamos išvedime prie cout ar išvedimo į failą operatoriaus (kurį susikūrėte prie ofstream), prieš kiekvieną vietą, kurioje reikia tam tikro formatavimo. Pavyzdžiui, cout atveju:

// Nustatomas 20 simbolių plotis ir kairinis teksto lygiavimas
cout << setw(20) << left << "tekstas" << endl;

Ar su išvedimo į failą operatoriumi:

ofstream isvedimas("failas.txt");

// Nustatomas 20 simbolių plotis ir kairinis teksto lygiavimas
isvedimas << setw(20) << left << "tekstas" << endl;

# Simbolių kiekio nustatymas eilutėje

Sintaksė:

setw(<skaicius>)

Bus nustatymas nurodyto pločio simbolių kiekis teksto ar skaičiaus išvedimui. Jei tekstas ar skaičius bus sudarytas iš mažiau simbolių nei nurodyta - likusi vieta bus užpildoma su paprastais tarpais, kad būtų užpildytas reikiamas plotis. O jeigu tekstas ar skaičius bus sudarytas iš daugiau simoblių nei nurodyta - bus nukerpama likusi dalis, kad neviršytų nurodyto pločio.

Pavyzdys:

setw(10)

Panaudojimas:

// dalis "tekstas" užims 10 simbolių vietos, todėl tai taps "   tekstas"
cout << setw(10) << "tekstas" << "kitas";

# Teksto lygiavimas

Kairėje pusėje:

left

Dešinėje pusėje:

right

Panaudojimas:

// dalis "tekstas" užims 10 simbolių vietos ir bus sulygiuotas kairėje pusėje,
// todėl tai taps "tekstas   "
cout << setw(10) << left << "tekstas" << "kitas";

# Skaičių po kablelio nustatymas

Bandant išvesti skaičių per kablelį (float, double), galima nurodyti kiek maksimaliai skaičių bus atvaizduojama po kablelio:

setprecision(<skaicius>)

Panaudojimas:

double skaicius = 8.58455;
cout << setprecision(3) << skaicius << endl; // 8.58

skaicius = 9.54;
cout << setprecision(5) << skaicius << endl; // 9.54

# Skaičių po kablelio užfiksavimas

Jeigu norima išvesti būtinai išvesti tam tikrą kiekį skaičių po kablelio, tai galima užfiksuoti su fixed raktažodžiu, kuris likusias vietas užpildys nuliais:

fixed

Panaudojimas:

double skaicius = 8.58455;
cout << fixed << setprecision(3) << skaicius << endl; // 8.585

skaicius = 9.54;
cout << fixed << setprecision(5) << skaicius << endl; // 9.54000

# Pavyzdžiai

# Pavyzdys 1

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    // sukuriamas išvedimo srauto operatorius
    ofstream rezultatai;

    // atsidaromas failas išvedimui
    rezultatai.open("rezultatai.txt");

    // išvedama informacija į failą
    rezultatai << "koks nors tekstas" << endl;
    rezultatai << "dar teksto, kitoje eiluteje" << endl;

    // failas uždaromas
    rezultatai.close();

    return 0;
}
koks nors tekstas
dar teksto, kitoje eiluteje

# Pavyzdys 2

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    // sukuriamas srauto operatorius išvedimui ir atidaromas failas išvedimui
    ofstream isvedimas("rezultatai.txt");

    // kintamieji duomenims
    string vardas;
    int amzius;

    // informacijos suvedimas konsolės pagalba
    cout << "Iveskite savo varda: ";
    cin >> vardas;
    cout << "Iveskite amziu: ";
    cin >> amzius;

    // informacijos išvedimas į failą
    isvedimas << "Ivestas vardas: " << vardas << endl;
    isvedimas << "Bei amzius: " << amzius << endl;

    // failo uždarymas
    isvedimas.close();

    return 0;
}
Ivestas vardas: Ieva
Bei amzius: 99

Konsolė:

Iveskite savo varda: Ieva
Iveskite amziu: 99

# Pavyzdys 3

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ofstream isvedimas("rezultatai.txt");

    int skaiciai[] = { 8, 5, 3, 5, 4 };
    int kiekis = 5;

    for (int i = 0; i < kiekis; i++)
    {
        isvedimas << skaiciai[i] << " ";
    }

    isvedimas.close();

    return 0;
}
8 5 3 5 4 

# Pavyzdys 4

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ofstream isvedimas("rezultatai.txt");

    string vardai[] = { "Tomas", "Petras", "Gintare", "Inga" };
    int amziai[] = { 70, 60, 30, 40 };
    int kiekis = 4;

    for (int i = 0; i < kiekis; i++)
    {
        isvedimas << vardai[i] << " " << amziai[i] << endl;
    }

    isvedimas.close();

    return 0;
}
Tomas 70
Petras 60
Gintare 30
Inga 40

# Pavyzdys 5

Kodas:

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

int main()
{
    ofstream isvedimas("rezultatai.txt");

    string vardai[] = { "Tomas", "Petras", "Gintare", "Inga" };
    int amziai[] = { 70, 60, 30, 40 };
    int kiekis = 4;

    isvedimas << "+---------------+--------+\n";
    isvedimas << "| Vardas        | Amzius |\n";
    isvedimas << "+---------------+--------+\n";

    for (int i = 0; i < kiekis; i++)
    {
        isvedimas << "| " << setw(13) << left
            << vardai[i] << " | " << setw(6)
            << left << amziai[i] << " |\n";
    }

    isvedimas << "+---------------+--------+\n";

    isvedimas.close();

    return 0;
}
+---------------+--------+
| Vardas        | Amzius |
+---------------+--------+
| Tomas         | 70     |
| Petras        | 60     |
| Gintare       | 30     |
| Inga          | 40     |
+---------------+--------+

# Pavyzdys 6

Kodas:

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

int main()
{
    ofstream isvedimas("rezultatai.txt");

    string vardai[] = { "Tomas", "Petras", "Gintare", "Inga" };
    double ugiai[] = { 1.85, 1.755, 1.7, 1.6 };
    int kiekis = 4;

    isvedimas << "+---------------+----------+\n";
    isvedimas << "| Vardas        | Ugis, m. |\n";
    isvedimas << "+---------------+----------+\n";

    for (int i = 0; i < kiekis; i++)
    {
        isvedimas << "| " << setw(13) << left
            << vardai[i] << " | " << setw(8)
            << left << setprecision(2) << ugiai[i] << " |\n";
    }

    isvedimas << "+---------------+----------+\n";

    isvedimas.close();

    return 0;
}
+---------------+----------+
| Vardas        | Ugis, m. |
+---------------+----------+
| Tomas         | 1.9      |
| Petras        | 1.8      |
| Gintare       | 1.7      |
| Inga          | 1.6      |
+---------------+----------+

# Pavyzdys 7

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ofstream isvedimas("rezultatai.txt");

    int skaiciai[] = { 8, 5, 4, 3, 2, 1, 5, 6 };
    int kiekis = 8;

    for (int i = 0; i < kiekis; i++)
    {
        isvedimas << skaiciai[i] << endl;
    }

    isvedimas.close();

    return 0;
}
8
5
4
3
2
1
5
6

# Pavyzdys 8

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ofstream isvedimas("rezultatai.txt");

    int skaiciai[] = { 8, 5, 4, 3, 2, 1, 5, 6 };
    int kiekis = 8;

    isvedimas << "Skaiciai: ";
    int suma = 0;

    for (int i = 0; i < kiekis; i++)
    {
        isvedimas << skaiciai[i] << " ";
        suma += skaiciai[i];
    }

    isvedimas << endl;
    isvedimas << "Siu skaiciu suma: " << suma;

    isvedimas.close();

    return 0;
}
Skaiciai: 8 5 4 3 2 1 5 6 
Siu skaiciu suma: 34

# Pavyzdys 9

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ofstream isvedimas("rezultatai.txt", ios::app);

    isvedimas << "tekstas" << endl;

    isvedimas.close();

    return 0;
}
tekstas
tekstas
tekstas

Pastaba

Kiekvieną kartą paleidus programą, failas yra pildomas toliau, o ne perrašomas.

# Pavyzdys 10

Kodas:

#include <iostream>
#include <fstream>
#include <ctime>
using namespace std;

int main()
{
    ofstream isvedimas("rezultatai.txt");

    srand(time(NULL));

    int kiek;
    cout << "Kiek skaiciu irasyti? ";
    cin >> kiek;
    
    for (int i = 0; i < kiek; i++)
    {
        isvedimas << rand() % 100 << " ";
    }

    isvedimas.close();

    return 0;
}
86 28 61 91 20 93 66 53 86 8 

Rezultatai:

Kiek skaiciu irasyti? 10

# Užduotys

# Užduotis 1

Į failą, skirtingose eilutėse, išveskite:

  • Savo vardą.
  • Kodėl mokotės C++.
  • Kaip jums sekasi mokytis.

# Užduotis 2

Į failą išveskite šių skaičiavimų atsakymus:

  • 5 + 3
  • 8 * 2
  • 9 / 2

# Užduotis 3

  • Leiskite vartotojui konsolės pagalba suvesti dabartinius metus ir savo gimimo metus.
  • Į failą išveskite apskaičiuotą žmogaus amžių.

# Užduotis 4

Susikurkite skaičių masyvą.

Raskite skaičių sumą, vidurkį, bei didžiausią skaičių.

Į failą išveskite šią informaciją:

  • Pirmoje eilutėje visus skaičius, atskiriant tarpu.
  • Antroje eilutėje rastą sumą, su prierašu "suma".
  • Trečioje eilutėje rastą vidurkį, su prierašu "vidurkis".
  • Ketvirtoje eilutėje rastą didžiausią skaičių, su prierašu "didžiausias skaičius".

# Užduotis 5

Susikurkite du skirtingus skaičių masyvus.

Iš kiekvieno masyvo raskite didžiausią skaičių.

Raskite kurio masyvo didžiausias skaičius yra didesnis.

Į failą išveskite šią informaciją:

  • Pirmoje eilutėje pirmo masyvo skaičius.
  • Antroje eilutėje pirmo masyvo didžiausią skaičių.
  • Trečioje eilutėje antro masyvo skaičius.
  • Ketvirtoje eilutėje antro masyvo didžiausią skaičių.
  • Penktoje eilutėje atsakymą kuriame masyve rastas didžiausias skaičius yra didesnis.

# Užduotis 6

Susikurkite du masyvus informacijai apie studentus saugoti:

  • Pirmasis masyvas - studentų vardai.
  • Antrasis masyvas - studentų vidurkiai (skaičiai per kablelį).

Šią informaciją išveskite į failą lentelės pavidalu:

  • Pirmame stulpelyje studento vardas.
  • Antrame stulpejyje studento vidurkis. Skaičius fiksuotas, 1-as skaičius po kablelio (9.5, 8.0, ...).

# Užduotis 7

Leiskite vartotojui papildyti failą skaičiais:

  • Vartotojas konsolės pagalba suveda norimą kiekį skaičių.
  • Šie skaičiai išvedami į failą, nepanaikinant anksčiau įrašytų skaičių.

# Užduotis 8

Į failą išveskite pasirinkto dydžio daugybos lentelę:

  • Vartotojas įveda norimą eilučių ir stulpelių kiekį konsolės pagalba.
  • Programa išveda nurodyto dydžio daugybos lentelę į failą.
  • Lentelė turi būti gražiai formatuota, t.y. skaičiai tuose pačiuose stulpeliuose ir pan., kad būtų vienas paskui kitą.

# Darbas su keliais duomenų ir rezultatų failais

# Pavyzdžiai

# Pavyzdys 1

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream duomenys("duomenys.txt");
    ofstream rezultatai("rezultatai.txt");

    int skaiciai[100];
    int kiekis = 0;

    while (!duomenys.eof())
    {
        duomenys >> skaiciai[kiekis];
        kiekis++;
    }

    int suma = 0;

    for (int i = 0; i < kiekis; i++)
    {
        suma += skaiciai[i];
    }

    rezultatai << "Skaiciu suma: " << suma << endl;

    duomenys.close();
    rezultatai.close();

    return 0;
}
7
4
5
9
8
5
2
Skaiciu suma: 40

# Pavyzdys 2

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream duomenys("duomenys.txt");
    ofstream rezultatai("rezultatai.txt");

    string dienos[7];
    int temperaturos[7];
    int kiekis = 7;

    for (int i = 0; i < kiekis; i++)
    {
        duomenys >> dienos[i] >> temperaturos[i] >> ws;
    }

    int silciausios_ind = 0, vesiausios_ind = 0;

    for (int i = 0; i < kiekis; i++)
    {
        if (temperaturos[i] > temperaturos[silciausios_ind])
        {
            silciausios_ind = i;
        }

        if (temperaturos[i] < temperaturos[vesiausios_ind])
        {
            vesiausios_ind = i;
        }
    }

    rezultatai << "Silciausia diena buvo " << dienos[silciausios_ind]
        << ", temperatura sieke " << temperaturos[silciausios_ind]
        << endl;

    rezultatai << "Vesiausia diena buvo " << dienos[vesiausios_ind]
        << ", temperatura sieke " << temperaturos[vesiausios_ind]
        << endl;

    duomenys.close();
    rezultatai.close();

    return 0;
}
Pirmadienis 17
Antradienis 18
Treciadienis 15
Ketvirtadienis 18
Penktadienis 19
Sestadienis 18
Sekmadienis 16
Silciausia diena buvo Penktadienis, temperatura sieke 19
Vesiausia diena buvo Treciadienis, temperatura sieke 15

# Pavyzdys 3

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream duomenys;

    int skaiciai[100];
    int kiekis = 0;

    duomenys.open("duomenys1.txt");

    while (!duomenys.eof())
    {
        duomenys >> skaiciai[kiekis++];
    }

    duomenys.close();

    duomenys.open("duomenys2.txt");

    while (!duomenys.eof())
    {
        duomenys >> skaiciai[kiekis++];
    }

    duomenys.close();

    ofstream rezultatai("rezultatai.txt");

    rezultatai << "Skaiciai is abieju duomenu failu:" << endl;

    for (int i = 0; i < kiekis; i++)
    {
        rezultatai << skaiciai[i] << " ";
    }

    rezultatai << endl;

    int suma = 0;

    for (int i = 0; i < kiekis; i++)
    {
        suma += skaiciai[i];
    }

    rezultatai << "Siu skaiciu bendra suma: " << suma << endl;

    rezultatai.close();

    return 0;
}
12
45
87
65
5 4 8 2 3
Skaiciai is abieju duomenu failu:
12 45 87 65 5 4 8 2 3 
Siu skaiciu bendra suma: 231

# Pavyzdys 4

Kodas:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream duomenys;

    string duomenu_failai[] = { "duomenys1.txt", "duomenys2.txt" };
    int duomenu_failu_kiekis = 2;

    int skaiciai[100];
    int kiekis = 0;

    for (int i = 0; i < duomenu_failu_kiekis; i++)
    {
        duomenys.open(duomenu_failai[i]);

        while (!duomenys.eof())
        {
            duomenys >> skaiciai[kiekis++];
        }

        duomenys.close();
    }

    ofstream rezultatai("rezultatai.txt");

    rezultatai << "Skaiciai is abieju duomenu failu:" << endl;
    int suma = 0;

    for (int i = 0; i < kiekis; i++)
    {
        rezultatai << skaiciai[i] << " ";
        suma += skaiciai[i];
    }

    rezultatai << endl;
    rezultatai << "Siu skaiciu bendra suma: " << suma << endl;

    rezultatai.close();

    return 0;
}
12
45
87
65
5 4 8 2 3
Skaiciai is abieju duomenu failu:
12 45 87 65 5 4 8 2 3 
Siu skaiciu bendra suma: 231

# Užduotys

# Užduotis 1

Duomenų faile esanti informacija:

4
Liepa     12
Berzelis  10
Obelis    13
Kriause   15

Duomenų failo pirmoje eilutėje yra nurodytas įrašų kiekis.

Kitose failo eilutėse saugoma ši informacija apie medžius:

  • Medžio pavadinimas.
  • Medžio amžius metais.

Atkreipkite dėmesį, kad medžio pavadinimams yra naudojamas atitinkamas simbolių kiekis, kadangi pavadinimą gali sudaryti ne vienas žodis.

Nuskaitykite šią informaciją iš failo.

Į kitą failą išveskite šią nuskaitytą informaciją gražiai lentelės pavidalu.

Taip pat, raskite ir išveskite šiuos dalykus:

  • Medžių amžiaus vidurkį.
  • Vyriausią medį.
  • Jaunausią medį.
  • Skirtumą tarp vyriausio ir jaunausio medžių.

# Užduotis 2

Faile esanti informacija:

Piestukas           0.99 45
Kreideles crayon    1.99 32
Sasiuvinys 50 psl.  1.49 26

Kiekvienoje failo eilutėje yra ši informacija apie prekes:

  • Prekės pavadinimas.
  • Kaina, eurais.
  • Turimų vienetų kiekis.

Atkreipkite dėmesį į tai kad prekės pavadinimas yra sudarytas iš atitinkamo simbolių kiekio, kadangi prekės pavadinimą gali sudaryti ne vienas žodis.

Nuskaitykite šią informaciją iš failo.

Išveskite nuskaitytą informaciją į rezultatų failą lentelės pavidalu. Kainą atvaizduokite fiksuotą du skaičiai po kablelio.

Taip pat, raskite:

  • Raskite kuri prekė yra pigiausia ir kuri brangiausia.
  • Kurios prekės yra daugiausiai vienetų.
  • Kurios prekės pelnas būtų didžiausias, jeigu pavyktų parduoti visus turimus vienetus.