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ą.
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:
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.
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).
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.
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).
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?
#include<iostream>#include<string>#include<fstream>usingnamespace std;intmain(){// kintamieji duomenims saugoti
string vardai[10];int kiek;// srauto operatoriaus sukūrimas ir failo atsidarymas
ifstream duomenys("duomenys.txt");// kiekio nuskaitymas
duomenys >> kiek;// failo nuskaitymasfor(int i =0; i < kiek; i++){
duomenys >> vardai[i];}// failo uždarymas
duomenys.close();// kiti veiksmaifor(int i =0; i < kiek; i++){
cout << vardai[i]<<", ";}return0;}
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:
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;
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";
// 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";
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:
#include<iostream>#include<fstream>usingnamespace std;intmain(){// 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();return0;}
#include<iostream>#include<fstream>usingnamespace std;intmain(){
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();return0;}
#include<iostream>#include<fstream>usingnamespace std;intmain(){
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();return0;}
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
#include<iostream>#include<fstream>usingnamespace std;intmain(){
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();return0;}
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