Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • U kontaktu sa
  • C pisanje u tekstualnu datoteku. Čitanje i pisanje datoteke

C pisanje u tekstualnu datoteku. Čitanje i pisanje datoteke

Ranije smo prilikom unosa i izlaza podataka radili sa standardnim streamovima - tastaturom i monitorom. Pogledajmo sada kako jezik C implementira primanje podataka iz datoteka i njihovo zapisivanje tamo. Prije nego što možete izvršiti ove operacije, morate otvoriti datoteku i pristupiti joj.

U programskom jeziku C, pokazivač na datoteku je tipa FILE i njegova deklaracija izgleda ovako:
FILE *myfile;

S druge strane, fopen() funkcija otvara datoteku na adresi navedenoj kao prvi argument u načinu čitanja ("r"), pisanja ("w") ili dodavanja ("a") i vraća pokazivač na nju na program. Stoga proces otvaranja datoteke i povezivanja s programom izgleda otprilike ovako:
myfile = fopen("hello.txt", "r");

Prilikom čitanja ili pisanja podataka u datoteku, pristupa se preko pokazivača datoteke (u ovom slučaju, myfile).

Ako iz jednog ili drugog razloga (nema datoteke na navedenoj adresi, pristup joj je odbijen) funkcija fopen() ne može otvoriti datoteku, onda vraća NULL. U stvarnim programima, oni gotovo uvijek obrađuju grešku otvaranja datoteke u grani if, ali ćemo to dalje izostaviti.

Deklaracija funkcije fopen() sadržana je u zaglavnoj datoteci stdio.h, tako da mora biti uključena. Također u stdio.h deklarisan je tip strukture FILE.

Nakon što je rad sa datotekom završen, uobičajeno je da se zatvori da bi se bafer oslobodio podataka i iz drugih razloga. Ovo je posebno važno ako program nastavi da radi nakon rada sa datotekom. Prekidanje veze između eksterne datoteke i pokazivača na nju iz programa se vrši pomoću funkcije fclose(). Pointer na fajl se prosleđuje kao parametar:
fclose(myfile);

U programu se može otvoriti više datoteka. U ovom slučaju, svaka datoteka mora biti povezana s vlastitim pokazivačem datoteke. Međutim, ako program prvo radi s jednom datotekom, a zatim je zatvori, tada se pokazivač može koristiti za otvaranje druge datoteke.

Čitanje i pisanje u tekstualnu datoteku

fscanf()

Funkcija fscanf() po značenju je slična funkciji scanf(), ali za razliku od nje, ona pruža formatirani unos iz datoteke, a ne standardni unos. Funkcija fscanf() uzima parametre: pokazivač datoteke, niz formata, adrese memorijskih područja za pisanje podataka:
fscanf(moja datoteka, "%s%d", str, &a);

Vraća broj uspješno pročitanih podataka ili EOF. Razmaci i znakovi novog reda se računaju kao graničnici podataka.

Recimo da imamo datoteku koja sadrži sljedeći opis objekata:

Jabuke 10 23,4 banane 5 25,0 kruh 1 10,3

#include main () ( FILE * datoteka; struct food ( char name[ 20 ] ; nepotpisana količina; float price; ) ; struct food shop[ 10 ] ; char i= 0 ; file = fopen ( "fscanf.txt" , "r" ) ; while (fscanf (fajl, "%s%u%f" , shop[ i].name , & (shop[ i].qty ) , & (shop[i].price ) ) != EOF) ( printf ("%s %u %.2f \n", shop[ i].name, shop[ i].qty, shop[i].price) ; i++; ) )

U ovom slučaju se deklariraju struktura i niz struktura. Svaki red iz datoteke odgovara jednom elementu niza; element niza je struktura koja sadrži niz i dva numerička polja. Petlja čita jedan red po iteraciji. Kada se naiđe na kraj datoteke, fscanf() vraća EOF i petlja se završava.

fgets()

Funkcija fgets() je slična funkciji gets() i vrši unos red po red iz datoteke. Jedan poziv fgets() će pročitati jedan red. U ovom slučaju ne možete pročitati cijeli red, već samo dio od početka. fgets() parametri izgledaju ovako:
fgets (niz_znakova, broj_pročitanih_karaktera, pokazivač na_datoteku)

Na primjer:
fgets(str, 50, moj fajl)

Ovaj poziv funkcije će pročitati iz datoteke povezane s pokazivačem myfile jedan cijeli red teksta ako je njegova dužina manja od 50 znakova, uključujući znak "\n", koji će funkcija također pohraniti u niz. Posljednji (50.) element str niza bit će znak "\0" koji dodaje fgets(). Ako je niz duži, funkcija će pročitati 49 znakova i napisati "\0" na kraju. U ovom slučaju, "\n" neće biti sadržan u redu za čitanje.

#include #define N 80 main () ( FILE * datoteka; char arr[ N] ; file = fopen ( "fscanf.txt" , "r" ) ; dok (fgets (arr, N, datoteka) != NULL) printf (" %s" , arr) ; printf (" \n") ; fclose(fajl); )

U ovom programu, za razliku od prethodnog, podaci se čitaju red po red u niz. Kada se pročita sljedeći red, prethodni se gubi. Funkcija fgets() vraća NULL ako ne može pročitati sljedeći red.

getc() ili fgetc()

Funkcija getc() ili fgetc() (obe rade) vam omogućava da dobijete sledeći pojedinačni znak iz datoteke.

dok ((arr[ i] = fgetc (datoteka) ) != EOF) ( if (arr[ i] == " \n") (arr[i] = " \0 " ; printf("%s \n", arr) ; i = 0 ; ) else i++; )arr[i] = " \0 " ; printf("%s \n", arr) ;

Primjer koda prikazuje podatke iz datoteke na ekranu.

Pisanje u tekstualnu datoteku

Baš kao i ulaz, izlaz u datoteku može biti različit.

  • Formatirani izlaz. Funkcija fprintf (file_index, format_string, varijable) .
  • Post-by-line izlaz. Funkcija fputs(string, file_pointer) .
  • Izlaz znak po znak. Funkcija fputc() ili putc(simbol, file_pointer) .

Ispod su primjeri koda koji koriste tri metode za izlaz podataka u datoteku.

Pisanje polja jedne strukture u svaki red datoteke:

file = fopen ("fprintf.txt" , "w" ) ; while (scanf ("%s%u%f" , shop[ i].name , & (shop[ i].qty ) , & (shop[i].price ) ) != EOF) ( fprintf (fajl, " %s %u %.2f \n", shop[ i].name, shop[ i].qty, shop[i].price) ; i++; )

Izlaz red po red u datoteku (fputs(), za razliku od samog puts(), ne stavlja “\n” na kraj reda):

while (dobije (arr) != NULL) ( fputs (arr, datoteka); fputs (" \n", fajl); )

Primjer izlaza znak po znak:

while ((i = getchar () ) != EOF) putc (i, fajl) ;

Čitanje i pisanje u binarnu datoteku

Možete raditi sa datotekom ne kao nizom znakova, već kao nizom bajtova. U principu, nije moguće raditi sa netekstualnim datotekama na bilo koji drugi način. Međutim, na ovaj način možete čitati i pisati u tekstualne datoteke. Prednost ove metode pristupa datoteci je brzina čitanja i pisanja: značajan blok informacija može se pročitati/upisati u jednom pristupu.

Kada otvarate datoteku za binarni pristup, drugi parametar za fopen() je niz "rb" ili "wb".

Tema rada s binarnim datotekama je prilično složena i zahtijeva posebnu lekciju za njeno proučavanje. Ovdje će biti navedene samo karakteristike funkcija čitanja i pisanja u datoteku, koja se smatra bajt streamom.

Funkcije fread() i fwrite() uzimaju kao parametre:

  1. adresa memorijskog područja iz kojeg se upisuju ili čitaju podaci,
  2. veličine jedne s obzirom na bilo koju vrstu,
  3. količina pročitanih podataka određene veličine,
  4. indeks datoteke.

Ove funkcije vraćaju broj podataka koji su uspješno pročitani ili upisani. One. možete "naručiti" čitanje 50 elemenata podataka, ali primite samo 10. Neće biti greške.

Primjer korištenja funkcija fread() i fwrite():

#include #include main () ( FILE * datoteka; char polica1[ 50 ], polica2[ 100 ] ; int n, m; file = fopen ("shelf1.txt", "rb"); n= fread (shelf1, sizeof (char) , 50 , datoteka) ; fclose (datoteka) ; file = fopen ("shelf2.txt" , "rb" ) ; m= fread (shelf2, sizeof (char), 50, datoteka) ; fclose (datoteka) ; polica1[ n] = " \0 " ; polica2[m] = " \n"; polica2[ m+ 1 ] = " \0 " ; file = fopen ("shop.txt" , "wb" ) ; fwrite (strcat (shelf2, shelf1) , sizeof (char ) , n+ m, file) ; fclose(fajl); )

Ovdje se pokušava pročitati 50 znakova iz prve datoteke. n pohranjuje broj stvarno pročitanih znakova. Vrijednost n može biti 50 ili manje. Podaci se postavljaju u red. Ista stvar se dešava i sa drugom datotekom. Zatim se prvi red dodaje drugom, a podaci se izbacuju u treću datoteku.

Rješavanje problema

  1. Napišite program koji od korisnika traži ime (adresu) tekstualne datoteke, zatim je otvara i broji broj znakova i redova u njoj.
  2. Napišite program koji u datoteku upisuje podatke primljene iz druge datoteke i izmijenjene na neki način prije pisanja. Svaki red podataka dobijenih iz datoteke mora se uklopiti u strukturu.

– poređenje za identifikaciju jednakosti ili nejednakosti.

Praktična svrha nabrajanja je definiranje skupa različitih simboličkih konstanti cjelobrojnog tipa.

Primjer korištenja nabrojanih varijabli:

mo=1, ut, we, th, fr, sa, su ) dana;

puts(“ Unesite dan u sedmici (od 1 do 7) : ”); scanf(“%d”, &t_dan);

w_dan = su; početak = mo;

kraj = w_dan -t_dan;

printf(“\n ponedjeljak je %d dan u sedmici, \ sada je %d dan. \n\

Do kraja sedmice %d dana (dana). “, početak, t_dan, kraj);

Rezultat programa: Unesite dan u sedmici (od 1 do 7): 2

Ponedjeljak je 1. dan u sedmici, sada je 2. dan. Do kraja sedmice ima 5 dana (dana).

18. Fajlovi na C jeziku

Datoteka je skup podataka koji se nalazi na vanjskom mediju i koji se tokom obrade smatra jedinstvenom cjelinom. Datoteke sadrže podatke namijenjene za dugotrajno skladištenje.

Postoje dvije vrste datoteka: tekstualni i binarni. Tekstualne datoteke su niz ASCII znakova i mogu se pregledavati i uređivati ​​pomoću bilo kojeg uređivača teksta.

Binarne (binarne) datoteke su niz podataka, čija struktura je određena softverom.

Jezik C ima veliki skup funkcija za rad sa datotekama, od kojih se većina nalazi u bibliotekama stdio.h i io.h.

18.1. Otvaranje fajla

Svakoj datoteci se dodjeljuje interno logičko ime, koje se kasnije koristi prilikom pristupa. Logički naziv (identifikator datoteke) je

pokazivač na fajl, tj. u memorijsku oblast koja sadrži sve potrebne informacije o datoteci. Format deklaracije pokazivača datoteke je sljedeći:

FILE * pokazivač na datoteku;

FILE – identifikator tipa strukture opisan u standardnoj biblioteci

stdio.h i koji sadrži sljedeće informacije:

tip struct(

– broj nepročitanih bajtova preostalih u baferu;

uobičajena veličina bafera je 512 bajtova; čim nivo=0,

sljedeći blok podataka se čita u bafer iz datoteke;

– oznaka statusa datoteke – čitanje, pisanje, dodavanje;

– deskriptor datoteke, tj. broj koji definiše njegovu ne-

unsigned char hold;

– nepreneseni karakter, tj. ungetc-karakter;

– veličina internog međubafera;

unsigned char bafer;

– vrijednost pokazivača za pristup unutar bafera, tj.

specificira početak bafera, početak reda ili trenutnu vrijednost

Vrijednost pokazivača unutar bafera ovisno o načinu rada

ma buffering;

unsigned char *curp;

– trenutna vrijednost pokazivača za pristup unutar

fera, tj. specificira trenutnu poziciju u baferu razmjene

dalje sa programom;

unsigned istemp;

– zastavica privremene datoteke;

– zastavica pri radu sa fajlom;

) FILE;

Prije nego počnete raditi sa fajlom, tj. Da biste mogli čitati ili pisati informacije u datoteku, ona mora biti otvorena za pristup. U tu svrhu se obično koristi funkcija

FILE* fopen(char* file_name, char* mod);

uzima eksterni prikaz - fizičko ime datoteke na mediju (disketa, tvrdi disk) i uparuje ga sa logičkim imenom.

Fizičko ime, tj. ime datoteke i putanju do nje specificira prvi parametar

– linija, na primjer, “a:Mas_dat.dat” – datoteka pod nazivom Mas_dat.dat koja se nalazi na disketi, “d:\\work\\Sved.txt” – datoteka pod nazivom Sved.txt koja se nalazi na hard disku pogon u radnom direktoriju.

Pažnja! Obrnuta kosa crta (\), kao poseban znak, piše se dva puta u jednom redu.

Nakon uspješnog otvaranja, fopen funkcija vraća pokazivač na datoteku (u daljem tekstu pokazivač datoteke). U slučaju greške, vraća se NULL. Ova situacija se obično dešava kada je putanja do datoteke koja se otvara pogrešno navedena. Na primjer, ako u klasi prikaza našeg univerziteta navedete putanju koja je zabranjena za pisanje (obično je dozvoljeno d:\work\).

Drugi parametar je linija koja specificira način pristupa datoteci:

w – datoteka je otvorena za pisanje; ako ne postoji fajl sa datim imenom, biće kreiran; ako takva datoteka postoji, tada se prethodne informacije uništavaju prije otvaranja;

r – datoteka se otvara samo za čitanje; ako nema takve datoteke, dolazi do greške;

a – datoteka se otvara da se dodaju nove informacije na kraj;

r+ – datoteka je otvorena za uređivanje podataka – moguće je i pisanje i čitanje informacija;

w+ – isto kao i za r+;

a+ – isto kao i za a, samo pisanje se može obaviti bilo gdje u datoteci; takođe je dostupno čitanje fajlova;

t – datoteka se otvara u tekstualnom modu; b – datoteka se otvara u binarnom modu.

Tekstualni način se razlikuje od binarnog načina po tome što kada se datoteka otvori kao tekst, par znakova “prevod u red”, “povratak na liniju” zamjenjuje se jednim znakom: “prevod reda” za sve funkcije za upisivanje podataka u datoteku , a za sve izlazne funkcije znak “line feed” “ sada je zamijenjen sa dva znaka: “line feed”, “carriage return”.

Podrazumevano, datoteka se otvara u tekstualnom režimu. Primjer: FILE *f; – deklarisan je pokazivač na datoteku f;

f = fopen("d:\\work\\Dat_sp.cpp", "w"); – datoteka sa logičkim imenom f, koja ima fizičko ime Dat_sp.cpp, koja se nalazi na disku d, u radnom direktoriju, otvara se za pisanje; ili kraće

FILE *f = fopen("d:\\work\\Dat_sp.cpp", "w");

18.2. Zatvaranje fajla

Nakon rada sa datotekom, pristup njoj mora biti zatvoren. To radi funkcija int fclose (pokazivač na datoteku). Na primjer, iz prethodnog primjera, datoteka se zatvara ovako: fclose (f);

Za zatvaranje više datoteka, uvodi se funkcija, deklarirana na sljedeći način: void fcloseall (void);

Ako trebate promijeniti način pristupa za datoteku, prvo morate zatvoriti datoteku, a zatim je ponovo otvoriti, ali s drugim pravima pristupa. Da biste to učinili, koristite standardnu ​​funkciju:

FILE* freopen (char*file_name, char *mode, FILE *file_pointer);

Ova funkcija prvo zatvara deklarirani fajl file_pointer(kao što to čini funkcija fopen), a zatim otvara datoteku s imenom datoteke i dozvolama "mode".

C jezik ima mogućnost rada sa privremenim datotekama koje su potrebne samo dok je program pokrenut. U ovom slučaju se koristi funkcija

FILE* tmpfile (void);

koji kreira privremenu datoteku na disku sa "w+b" pravima pristupa; nakon što se program završi ili nakon što se privremeni fajl zatvori, automatski se briše.

18.3. Pišite – čitajte informacije

Sve akcije za čitanje i upisivanje podataka u datoteku mogu se podijeliti u tri grupe: operacije unosa-izlaza karakter po znak; line-by-line I/O operacije; blok I/O operacije.

Pogledajmo glavne funkcije koje se koriste u svakoj od ove tri grupe operacija.

U/I karakter po karakter

U I/O funkcijama karakter po znak, jedan znak se prima iz datoteke ili se jedan znak šalje u datoteku:

Red I/O

Linijski I/O funkcije prenose iz datoteke ili u

Blokiraj I/O

Blok I/O funkcije rade na cijelim blokovima

informacije:

int fread (void*p, intsize,

– čita n blokova veličine bajta svaki iz datoteke

int n, FILE *f)

la f u memorijsku oblast sa pokazivačem p (obavezno

int fwrite (void*p, intsize,

unaprijed dodijeliti memoriju za blok koji će se čitati);

– zapisuje n blokova veličine bajtova svaki iz

int n, FILE *f)

memorijska oblast sa pokazivačem p na datoteku f.

Formatirane I/O proizvode funkcije.

Već smo naučili kako zapisati informacije u tekstualnu datoteku. – Ako niste naučili kako, pogledajte prethodni članak. Ispričano je i detaljno opisano

Ali šta ako datoteka već postoji i iz nje trebamo pročitati informacije za obradu? Na sreću, i ovo je prilično jednostavno. Da vas podsjetim da postoji nekoliko opcija za implementaciju ovog zadatka, a opisao sam samo jednu od njih. Ovaj opisani je onaj koji se meni lično iz nekog razloga čini najlakšim za razumijevanje.

#include

int main()
{
char s1 //Varijabla će pročitati string
ifstream u (“C:\\\FromC\\myfile.txt” ); //Otvorite datoteku da pročitate informacije
u >>s1 ; //pročitaj red
in.close() // Zatvaranje fajla

cout<Iznesite vrijednost s1 na ekran
return 0 ;
}

Ovo je najjednostavniji program za čitanje prvog reda iz tekstualne datoteke koja se nalazi duž putanje
C:\\\FromC\\myfile.txt –
Pošto je ovo nastavak prethodnog članka, odlučio sam da koristim fajl koji smo tamo kreirali. Vjerovatno ne bi trebalo biti nikakvih poteškoća s ovim.
No, vratimo se kodu. Prvo otvorimo datoteku da pročitamo informacije iz nje, za to koristimo naredbu ifstream u zagradama označavamo ili ime datoteke ili putanju do datoteke, kao što sam ja učinio. (“C:\\\FromC\\myfile.txt” );
Kada smo otvorili datoteku da nešto pročitamo iz nje, deklarirali smo jednu varijablu kao char –
char s1
Sada sve što treba da uradimo je da promenljivoj dodelimo vrednost niza iz datoteke. Radimo ovo kao tim in
Obratite pažnju na ugaone zagrade u >>
Zapravo, kao što bi trebalo biti jasno iz komentara na programski kod, da bi varijabla dodijelila pročitanu vrijednost, moramo je napisati nakon u >>
u >>s1 ;

Čini se da ovo nije posebno težak zadatak, pogotovo ako ste već savršeno savladali i naučili koristiti materijal iz prethodnog članka - sve je apsolutno isto, samo 2 naredbe se razlikuju

Kreiranje datoteke i pisanje C++ informacija u nju

ofstream van ( Ime dokumenta );
van<< (String za pisanje);
van.close();
=============================

Čitanje teksta iz datoteke i ispis teksta na ekran u C++

ifstream in (Ime dokumenta );
in>> (Čitanje reda);
in.close();(Zatvorite fajl)
============================
Napišimo jednostavan program koji će čitati unos teksta s tastature i zapisivati ​​ga u datoteku:

#include
#include

int main()
{
\\ 3 buduće linije
clrscsr(); // Brisanje ekrana

cout<<“Wwedi pervuu stroku” ; cin >>a ; endl ;
cout<<“Wwedi wtoruu stroku” ; cin >>b ; endl ;
cout<<“Wwedi tretuu stroku” ; cin >>c ; endl ;
clrscr(); //

/*Počnite raditi s fajlom*/
outstream out (“C:\\\FromC\\myfile.txt” ); //Otvaranje datoteke za pisanje
van<Zapišite prvi red
van<Napišite drugi red
van<Zapišite treći red
out.close(); // Zatvaranje fajla

//Reset varijabli

za (int i =0 ;i<=255 ;i ++)
(a =*“” ; b =*“” ; c =*“” ;)


ifstream u(“C:\\\FromC\\myfile.txt” );
u >>a >>b >>c ; //Svaki novi red čitamo u novu varijablu
in.close(); // Zatvaranje fajla

/* */

za (i =0 ;a !=*“” ;i ++)
{
if (i >sizeof(a)) break ;
cout<

}
cout<<“\n” ; \\

/* */


{
ako (i >sizeof(b)) break ;
cout<
}
cout<<“\n” ; \\ Pomaknuo kursor u novi red

/* */

za (i =0 ;s !=*“” ;i ++)
{
if (i >sizeof(c)) break ;
cout<<с ;
}

return 0 ;
}
===================

U gornjim primjerima postoji jedan takav OGROMNO nedostatak. Ako pokušamo da unesemo red koji sadrži razmake, program neće raditi kako nam je potrebno. Vjerovatno sam ne samo ja, nego i mnogi drugi ljudi naišli na ovu grešku. Stoga ostavljam neispravan kod kako biste mogli vidjeti na šta možete naići.

Pošto kod kuće nema knjiga, ponovo sam počeo da pretražujem internet i pronašao mnogo raznoraznih sofisticiranih gluposti. Ali nekako sam pronašao rješenje za svoj problem.
Pomoglo mi je što sam to pročitao cout podržava njegove metode. A na internetu svi savjeti se odnose na korištenje funkcije getline Na moju sreću, vrlo brzo sam saznao kako se koristi ova funkcija i onda je koristio u kodu.
Općenito, vrijedi spomenuti i opisati ovu funkciju, ali do sada je nisam baš razumio, samo razumijem da je treba koristiti i razumijem kako, pa ću dati ispravniji primjer našeg programa koji se razvija :

#include
#include

int main()
{
char a,b,c; \\ 3 buduće linije
clrscsr(); // Brisanje ekrana

/* Unesite vrijednosti za varijable*/

cout<<“Wwedi pervuu stroku” ; cin.getline(a,sizeof(a)); endl ;
cout<<“Wwedi wtoruu stroku” ; cin.getline(a,sizeof(b)); endl ;
cout<<“Wwedi tretuu stroku” ; cin.getline(a,sizeof(c)); endl ;
clrscr(); //Nakon unosa vrijednosti, ekran je obrisan

/*Počnite raditi s fajlom*/
outstream out (“C:\\\FromC\\myfile.txt”); // Otvaranje datoteke za pisanje
van<
Zapišite prvi red
van<Napišite drugi red
van<Zapišite treći red
out.close(); // Zatvaranje fajla

//Reset varijabli

za (int i =0 ;i<=255 ;i ++)
(a =*“” ; b =*“” ; c=*“” ;)

/*Nastavi rad sa fajlom*/

ako stream u (“C:\\\FromC\\myfile.txt” );
in.getline(a,sizeof(a));// A
in.getline(b,sizeof(b));// Čitanje reda u varijablu b
in.getline(c,sizeof(c)); // Čitanje reda u varijablu c
in.close(); // Zatvaranje fajla

/* Čitamo prvi red znak po znak i prikazujemo ga na ekranu */

za (i =0 ;a !=*“” ;i++)
{
if (i >sizeof(a)) break ;
cout<

}
cout<<“\n” ; \\ Pomaknuo kursor u novi red

/* Čitamo drugi red znak po znak i prikazujemo ga na ekranu */

za (i =0 ;b !=*“” ;i ++)
{
ako (i >sizeof(b)) break ;
cout<
}
cout<<“\n” ; \\ Pomaknuo kursor u novi red

/* Čitamo treći red znak po znak i prikazujemo ga na ekranu */

za (i =0 ;s !=*“” ;i++)
{
if (i>sizeof (c)) break ;
cout<<с[i];
}

getch(); \\Čeka se da se pritisne tipka Enter
return 0 ;
}
===================

Ovaj materijal opisuje primjer čitanja informacija karakter po lik. Pošto nisam opisao rad sa varijablama poput char, tada početnici mogu doživjeti neke neugodnosti u razumijevanju koda. Samo nisam znao koji tip char ima neke posebnosti i mislio sam da je sve jednostavnije. Stoga, neke nerazumljive momente gore navedenog programa možete pročitati u sljedećem članku rad sa char V C++ za početnike

Inače, dati primjer kako čitati redove iz tekstualne datoteke u C++ bi trebao biti pristupačan i sasvim razumljiv. Ovo trenutno nije optimalna opcija implementacije i propustio sam neke važne tačke, ali pošto počinjemo da učimo C++ jezik, za sada je ovo sasvim dovoljno. Kasnije ću verovatno doći do onoga što sam propustio, ali sada treba da sagledam samo ono najpotrebnije.

Ako vi i ja razumijemo ovaj materijal, to znači da smo napravili mali korak ka našem profesionalizmu.

Bilješka:
break ;– Ovo je naredba koja izlazi iz petlje. Imamo brojač ciklusa ako za postaje veća od deklarirane veličine varijable ugljen, onda nasilno izlazimo iz petlje
!= – Ovo je uslov koji smo postavili. Ovaj uslov je označen nejednakošću
if(a !=b)– Čita kao da a nije jednako b

endl ; – Ovo pomera kursor na novu liniju unutar konzole (koliko ja razumem)
Ova komanda je slična “\n”

Posljednje ažurirano: 31.10.2015

Klasa FileStream predstavlja mogućnosti čitanja iz datoteke i pisanja u datoteku. Omogućava vam rad i sa tekstualnim i binarnim datotekama.

Razmotrimo njegova najvažnija svojstva i metode:

    Svojstvo dužine: vraća dužinu toka u bajtovima

    Svojstvo pozicije: vraća trenutnu poziciju u toku

    Metod čitanja: Čita podatke iz datoteke u niz bajtova. Uzima tri parametra: int Read(niz bajtova, int offset, int count) i vraća broj uspješno pročitanih bajtova. Ovdje se koriste sljedeći parametri:

    • niz - niz bajtova u koji će biti smješteni podaci pročitani iz datoteke

      offset predstavlja pomak u bajtovima u nizu u koji će pročitani bajtovi biti smješteni

      count - maksimalni broj bajtova za čitanje. Ako u datoteci ima manje bajtova, svi će biti pročitani.

    Metoda dugo traženje (dugo pomak, porijeklo traženja): postavlja poziciju u toku s pomakom za broj bajtova navedenih u parametru pomaka.

    Način pisanja: Zapisuje podatke iz niza bajtova u datoteku. Uzima tri parametra: Write (niz bajtova, int offset, int count)

    • niz - niz bajtova iz kojih će podaci biti upisani u datoteku

      offset - pomak u bajtovima u nizu odakle bajtovi počinju da se upisuju u tok

      count - maksimalni broj bajtova za upisivanje

FileStream predstavlja pristup datoteci na nivou bajtova, tako da, na primjer, ako trebate pročitati ili napisati jedan ili više redova u tekstualnu datoteku, tada se niz bajtova mora konvertirati u nizove pomoću posebnih metoda. Stoga se druge klase koriste za rad s tekstualnim datotekama.

Istovremeno, kada radite s raznim binarnim datotekama koje imaju određenu strukturu, FileStream može biti vrlo koristan za izdvajanje određenih dijelova informacija i njihovu obradu.

Pogledajmo primjer čitanja i pisanja u tekstualnu datoteku:

Console.WriteLine("Unesite red za pisanje u datoteku:"); string text = Console.ReadLine(); // pisanje u datoteku pomoću (FileStream fstream = new FileStream(@"C:\SomeDir\noname\note.txt", FileMode.OpenOrCreate)) ( // pretvoriti string u bajtove niz bajtova = System.Text.Encoding. Default. GetBytes(text); // upisivanje niza bajtova u datoteku fstream.Write(array, 0, array.Length); Console.WriteLine("Tekst upisan u datoteku"); ) // čitanje iz datoteke koristeći (FileStream fstream = File. OpenRead(@"C:\SomeDir\noname\note.txt")) ( // pretvaranje niza u bajtove bajt array = novi bajt; // čitanje podataka fstream.Read(array, 0, array.Length); // dekodiranje bajtova u string string textFromFile = System.Text.Encoding.Default.GetString(array); Console.WriteLine("Tekst iz datoteke: (0)", textFromFile); ) Console.ReadLine() ;

Pogledajmo ovaj primjer. I čitanje i pisanje koriste naredbu using. Ovu izjavu ne treba miješati sa direktivom using, koja uključuje prostore imena na početku datoteke koda. Naredba using vam omogućava da kreirate objekat u bloku koda, nakon čijeg završetka se poziva metoda Dispose tog objekta i samim tim se objekat uništava. U ovom slučaju, varijabla fstream služi kao takav objekt.

Objekt fstream se kreira na dva različita načina: kroz konstruktor i kroz jednu od statičkih metoda klase File.

Ovdje se konstruktoru prosljeđuju dva parametra: putanja datoteke i FileMode nabrajanje. Ovo nabrajanje označava način pristupa datoteci i može imati sljedeće vrijednosti:

    Dodati: ako datoteka postoji, tekst se dodaje na kraj datoteke. Ako datoteka ne postoji, kreira se. Fajl se otvara samo za pisanje.

    Kreiraj : kreiran je novi fajl. Ako takva datoteka već postoji, ona se prepisuje

    CreateNew: Nova datoteka je kreirana. Ako takva datoteka već postoji, tada aplikacija prikazuje grešku

    Otvori: Otvara datoteku. Ako datoteka ne postoji, izbacuje se izuzetak

    OpenOrCreate : ako datoteka postoji, otvara se, ako ne, kreira se nova

    Skraćivanje: Ako datoteka postoji, ona se prepisuje. Fajl se otvara samo za pisanje.

Statički OpenRead metod klase File otvara datoteku za čitanje i vraća FileStream objekat.

Konstruktor klase FileStream također ima brojna preopterećenja koja vam omogućavaju da preciznije prilagodite objekt koji se kreira. Sve ove verzije se mogu pogledati na msdn.

I pisanje i čitanje koriste Encoding.Default objekt kodiranja iz imenskog prostora System.Text. U ovom slučaju koristimo dvije njegove metode: GetBytes da dobijemo niz bajtova iz niza i GetString da dobijemo string iz niza bajtova.

Kao rezultat, string koji smo uneli se upisuje u datoteku note.txt. U suštini, ovo je binarna datoteka (a ne tekstualna datoteka), iako ako upišemo samo red u nju, možemo vidjeti ovu datoteku u ljudskom čitljivom obliku otvaranjem u uređivaču teksta. Međutim, ako u njega upišemo nasumične bajtove, na primjer:

Fstream.WriteByte(13); fstream.WriteByte(103);

Tada ćemo možda imati problema s razumijevanjem. Stoga su odvojene klase dizajnirane za direktan rad s tekstualnim datotekama - StreamReader i StreamWriter.

Slučajni pristup fajlovima

Često binarne datoteke predstavljaju specifičnu strukturu. I, poznavajući ovu strukturu, možemo uzeti potrebnu informaciju iz datoteke ili, obrnuto, napisati određeni skup bajtova na određeno mjesto u datoteci. Na primjer, u wav datotekama, sami audio podaci počinju od 44 bajta, a do 44 bajta postoje različiti metapodaci - broj audio kanala, frekvencija uzorkovanja itd.

Koristeći metodu Seek(), možemo kontrolisati položaj kursora toka, počevši od kojeg se datoteka čita ili piše. Ova metoda uzima dva parametra: pomak i poziciju u datoteci. Pozicija u datoteci je opisana sa tri vrijednosti:

    SeekOrigin.Begin : početak datoteke

    SeekOrigin.End : kraj datoteke

    SeekOrigin.Current : trenutna pozicija u datoteci

Kursor toka iz kojeg počinje čitanje ili pisanje pomiče se naprijed za pomak u odnosu na poziciju specificiranu kao drugi parametar. Pomak može biti negativan, tada se kursor pomiče unazad, ako je pozitivan, onda naprijed.

Pogledajmo primjer:

Using System.IO; koristeći System.Text; class Program ( static void Main(string args) (string text = "hello world"; // pisanje u datoteku koristeći (FileStream fstream = new FileStream(@"D:\note.dat", FileMode.OpenOrCreate)) ( / / pretvoriti string u bajtove byte input = Encoding.Default.GetBytes(text); // upisati niz bajtova u datoteku fstream.Write(input, 0, input.Length); Console.WriteLine("Tekst upisan u datoteku "); // pomičemo pokazivač na kraj datoteke, pet bajtova na kraj datoteke fstream.Seek(-5, SeekOrigin.End); // minus 5 znakova od kraja toka // čitaj četiri znakovi sa trenutne pozicije bajt output = novi bajt; fstream.Read( output, 0, output.Length); // dekodiranje bajtova u string string textFromFile = Encoding.Default.GetString(output); Console.WriteLine("Text iz datoteke: (0)", textFromFile); // worl // zamijenite u datoteci riječ world sa riječju house string replaceText = "house"; fstream.Seek(-5, SeekOrigin.End); // minus 5 znakovi s kraja toka input = Encoding.Default.GetBytes(replaceText);fstream.Write(input, 0, input.Length); // čitanje cijele datoteke // vraćanje pokazivača na početak datoteke fstream.Seek(0, SeekOrigin.Begin); izlaz = novi bajt; fstream.Read(izlaz, 0, output.Length); // dekodiranje bajtova u string textFromFile = Encoding.Default.GetString(output); Console.WriteLine("Tekst iz datoteke: (0)", textFromFile); // hello house ) Console.Read(); ) )

Izlaz konzole:

Tekst upisan u datoteku Tekst iz datoteke: worl Tekst iz datoteke: hello house

Pozivanje fstream.Seek(-5, SeekOrigin.End) pomera kursor toka na kraj fajla unazad pet znakova:

Odnosno, nakon pisanja reda „zdravo svijete“ u novu datoteku, kursor će biti na poziciji znaka „w“.

Nakon toga, čitamo četiri bajta koji počinju sa znakom "w". U ovom kodiranju, 1 znak će predstavljati 1 bajt. Stoga će čitanje 4 bajta biti ekvivalentno čitanju četiri znaka: "worl".

Zatim, opet, prelazimo na kraj datoteke, ne dostižući kraj od pet znakova (to jest, opet sa pozicije znaka "w") i upisujemo niz "house". Dakle, string "house" zamjenjuje string "world".

Zatvaranje teme

U gornjim primjerima, using konstrukcija se koristi za zatvaranje toka. Nakon što su svi operatori i izrazi u bloku using obrađeni, objekt FileStream se uništava. Međutim, možemo izabrati i drugi način:

FileStream fstream = null; try ( fstream = new FileStream(@"D:\note3.dat", FileMode.OpenOrCreate); // operacije sa streamom) catch(Exception ex) () konačno ( if (fstream != null) fstream.Close() ; )

Ako ne koristimo konstrukciju using, onda moramo eksplicitno pozvati Close() metodu: fstream.Close()

Većina kompjuterskih programa radi sa datotekama, pa stoga postoji potreba za kreiranjem, brisanjem, pisanjem, čitanjem, otvaranjem datoteka. Šta je fajl? Datoteka je imenovani skup bajtova koji se može pohraniti na neki uređaj za pohranu. Pa, sada je jasno da datoteka znači određeni niz bajtova koji ima svoje jedinstveno ime, na primjer file.txt. Datoteke s istim imenima ne mogu se nalaziti u istom direktoriju. Ime datoteke ne odnosi se samo na njeno ime, već i na ekstenziju, na primjer: file.txt i file.dat različite datoteke, iako imaju ista imena. Postoji nešto kao puno ime datoteke - ovo je puna adresa direktorija datoteke koja označava naziv datoteke, na primjer: D:\docs\file.txt. Važno je razumjeti ove osnovne koncepte, inače će biti teško raditi s datotekama.

Za rad sa datotekama potrebno je da uključite datoteku zaglavlja . IN definirano je nekoliko klasa i uključene su datoteke zaglavlja unos datoteke i izlaz datoteke.

Datoteka I/O je sličan standardnom I/O, jedina razlika je u tome što se I/O izvodi na fajl, a ne na ekran. Ako se I/O u standardne uređaje izvodi pomoću cin i cout objekata, onda je za organizaciju I/O fajla dovoljno kreirati vlastite objekte koji se mogu koristiti slično kao i cin i cout operatori.

Na primjer, trebate kreirati tekstualnu datoteku i u nju napisati red Rad s datotekama u C++. Da biste to učinili potrebno je da preduzmete sljedeće korake:

  1. kreirati objekat klase ofstream ;
  2. povezati objekt klase sa datotekom u koju će se pisati;
  3. upisati liniju u datoteku;
  4. zatvorite datoteku.

Zašto je potrebno kreirati ofstream objekt umjesto ifstream objekta? Budući da trebate pisati u datoteku, i ako trebate čitati podatke iz datoteke, stvorit će se ifstream objekt klase.

// kreiranje objekta za pisanje u datoteku ofstream /*ime objekta*/; // objekt klase ofstream

Nazovimo objekat fout. Evo šta dobijamo:

Ofstream fout;

Zašto nam je potreban objekat? Objekt je potreban da bi mogao pisati u datoteku. Objekt je već kreiran, ali nije povezan s datotekom u koju treba upisati niz.

Fout.open("cppstudio.txt"); // povezujemo objekt s datotekom

Operacijom tačke dobijamo pristup metodi klase open(), u kojoj označavamo ime datoteke u zagradama. Navedena datoteka će biti kreirana u trenutnom direktoriju s programom. Ako postoji datoteka s istim imenom, postojeća datoteka će biti zamijenjena novom. Dakle, datoteka je otvorena, ostaje samo da upišete potrebnu liniju u nju. Ovo se radi ovako:

Fout<< "Работа с файлами в С++"; // запись строки в файл

Koristeći stream operaciju u sprezi sa fout objektom, string Rad sa datotekama u C++ se upisuje u datoteku. Pošto više nema potrebe za promjenom sadržaja datoteke, ona se mora zatvoriti, odnosno objekt mora biti odvojen od datoteke.

Fout.close(); // zatvorite datoteku

Rezultat - kreiran je fajl sa linijom Rad sa fajlovima u C++.

Koraci 1 i 2 se mogu kombinovati, odnosno u jednom redu kreirati objekat i pridružiti ga fajlu. Ovo se radi ovako:

Ofstream fout("cppstudio.txt"); // kreiramo objekt klase ofstream i povezujemo ga sa cppstudio.txt datotekom

Hajde da kombinujemo sav kod i dobijemo sledeći program.

// file.cpp: Definira ulaznu točku za aplikaciju konzole. #include "stdafx.h" #include korištenje imenskog prostora std; int main(int argc, char* argv) ( ofstream fout("cppstudio.txt"); // kreiraj objekat klase ofstream za snimanje i pridruži ga datoteci cppstudio.txt fout<< "Работа с файлами в С++"; // запись строки в файл fout.close(); // закрываем файл system("pause"); return 0; }

Ostaje provjeriti da li program radi ispravno, a da biste to učinili, otvorite datoteku cppstudio.txt i pogledajte njegov sadržaj, trebalo bi da bude - Rad sa fajlovima u C++.

  1. kreirajte objekat klase ifstream i pridružite ga datoteci iz koje će se čitati;
  2. read file;
  3. zatvorite datoteku.
// file_read.cpp: Definira ulaznu točku za aplikaciju konzole. #include "stdafx.h" #include #include korištenje imenskog prostora std; int main(int argc, char* argv) ( setlocale(LC_ALL, "rus"); // ispravan prikaz ćiriličnog char buffa; // međuspremnik za međuskladištenje teksta pročitanog iz datoteke ifstream fin("cppstudio.txt") ; // otvorio fajl za čitanje fin >><< buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку system("pause"); return 0; }

Program pokazuje dva načina čitanja iz datoteke, prvi koristi operaciju prijenosa u stream, drugi koristi funkciju getline() . U prvom slučaju čita se samo prva riječ, au drugom se čita niz dužine 50 znakova. Ali pošto je u datoteci ostalo manje od 50 znakova, čitaju se znakovi do i uključujući posljednjeg. Imajte na umu da čitate drugi put (red 17) se nastavlja nakon prve riječi, a ne od početka, pošto je prva riječ pročitanared 14. Rezultat programa je prikazan na slici 1.

Rad sa datotekama u C++ Da biste nastavili, pritisnite bilo koji taster. . .

Slika 1 – Rad sa datotekama u C++

Program je radio ispravno, ali to se ne događa uvijek, čak i ako je sve u redu sa kodom. Na primjer, ime nepostojeće datoteke je proslijeđeno programu ili je došlo do greške u imenu. Šta onda? U ovom slučaju, ništa se neće dogoditi. Fajl neće biti pronađen, što znači da ga neće biti moguće pročitati. Stoga će kompajler zanemariti redove u kojima se radi na datoteci. Kao rezultat toga, program će se ispravno zatvoriti, ali ništa se neće prikazati na ekranu. Čini se da je to sasvim normalna reakcija na takvu situaciju. Ali jednostavan korisnik neće razumjeti šta se dešava i zašto se linija iz datoteke nije pojavila na ekranu. Dakle, da bi sve bilo vrlo jasno, C++ pruža takvu funkciju - is_open(), koja vraća cjelobrojne vrijednosti: 1 - ako je datoteka uspješno otvorena, 0 - ako datoteka nije otvorena. Izmijenimo program otvaranjem datoteke, tako da ako datoteka nije otvorena, prikaže se odgovarajuća poruka.

// file_read.cpp: Definira ulaznu točku za aplikaciju konzole. #include "stdafx.h" #include #include korištenje imenskog prostora std; int main(int argc, char* argv) ( setlocale(LC_ALL, "rus"); // ispravan prikaz ćiriličnog char buffa; // bafer za međuskladištenje teksta pročitanog iz datoteke ifstream fin("cppstudio.doc") ; // (UNESI STE NEVAŽEĆI NAZIV DATOTEKE) if (!fin.is_open()) // ako datoteka nije otvorena cout<< "Файл не может быть открыт!\n"; // сообщить об этом else { fin >>buff; // prebrojao prvu riječ iz datoteke cout<< buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку } system("pause"); return 0; }

Rezultat programa je prikazan na slici 2.

Fajl se ne može otvoriti! Da nastavite, pritisnite bilo koji taster. . .

Slika 2 – Rad sa datotekama u C++

Kao što se može vidjeti na slici 2, program je prijavio da je nemoguće otvoriti datoteku. Stoga, ako program radi s datotekama, preporučuje se korištenje ove funkcije, is_open(), čak i ako ste sigurni da datoteka postoji.

Načini otvaranja datoteka

Načini otvaranja datoteka određuju kako se datoteke koriste. Za postavljanje režima, klasa ios_base obezbeđuje konstante koje određuju način otvaranja datoteke (pogledajte tabelu 1).

Načini otvaranja datoteka mogu se postaviti direktno prilikom kreiranja objekta ili prilikom pozivanja funkcije open(). .

Ofstream fout("cppstudio.txt", ios_base::app); // otvorite datoteku da dodate informacije na kraj datoteke fout.open("cppstudio.txt", ios_base::app); // otvorite datoteku da dodate informacije na kraj datoteke

Načini otvaranja datoteka mogu se kombinirati korištenjem bitne logičke operacije ili| , na primjer: ios_base::out | ios_base::trunc - otvara datoteku za pisanje nakon brisanja.

Objekti klase ofstream, kada su povezani sa fajlovima, podrazumevano sadrže načine otvaranja fajlova ios_base::out | ios_base::trunc . Odnosno, datoteka će biti kreirana ako ne postoji. Ako datoteka postoji, njen sadržaj će biti obrisan, a sam fajl će biti spreman za pisanje. Objekti ifstream klase, kada su povezani s datotekom, imaju zadani način otvaranja datoteke ios_base::in - datoteka je otvorena samo za čitanje. Način otvaranja fajla se također naziva zastavica; radi čitljivosti koristit ćemo ovaj termin u budućnosti. Tabela 1 ne navodi sve zastavice, ali ove bi trebale biti dovoljne da započnete.

Imajte na umu da su ate i app zastavice vrlo slične u opisu, obje pomiču pokazivač na kraj datoteke, ali zastavica aplikacije dozvoljava samo pisanje na kraj datoteke, a ate zastavica jednostavno pomiče zastavicu na kraj datoteke i ne ograničava gdje pisati.

Hajde da razvijemo program koji će, koristeći operaciju sizeof(), izračunati karakteristike glavnih tipova podataka u C++ i zapisati ih u datoteku. karakteristike:

  1. broj bajtova dodijeljenih za tip podataka
  2. maksimalna vrijednost koju određeni tip podataka može pohraniti.

Datoteka mora biti napisana u sljedećem formatu:

/* tip podataka bajt maksimalna vrijednost bool = 1 255,00 char = 1 255,00 short int = 2 32767,00 unsigned short int = 2 65535,00 int = 4 2147483647,00 unsigned int = 4 47294 int = 4 47294 int = 4 47294 int. 7,00 unsigned long int = 4 4294967295,00 float = 4 2147483647,00 dugi plutajući = 8 9223372036854775800,00 dupli = 8 9223372036854775800,00 */

Takav program je već razvijen ranije u odjeljku, ali tamo su sve informacije o tipovima podataka bile izlazne na standardni izlazni uređaj, a mi moramo prepraviti program tako da se informacije upisuju u datoteku. Da biste to učinili, morate otvoriti datoteku u načinu pisanja, s preliminarnim skraćenjem informacija o trenutnoj datoteci ( red 14). Jednom kada je datoteka kreirana i uspješno otvorena (redovi 16 - 20), umjesto naredbe cout, u red 22 koristimo fout objekat. tako, umjesto ekrana, informacije o tipovima podataka će biti upisane u datoteku.

// write_file.cpp: Definira ulaznu točku za aplikaciju konzole. #include "stdafx.h" #include #include // rad sa datotekama #include // ulazno/izlazni manipulatori koji koriste prostor imena std; int main(int argc, char* argv) ( setlocale(LC_ALL, "rus"); // povežemo objekat sa datotekom i otvorimo datoteku u načinu pisanja, prvo izbrišući sve podatke iz nje iz toka fout("data_types.txt ", ios_base::out | ios_base::trunc); if (!fout.is_open()) // ako datoteka nije otvorena ( cout<< "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение return 1; // выполнить выход из программы } fout << " data type " << "byte" << " " << " max value "<< endl // zaglavlja stupaca <<"bool = " << sizeof(bool) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных bool*/ << (pow(2,sizeof(bool) * 8.0) - 1) << endl << "char = " << sizeof(char) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных char*/ << (pow(2,sizeof(char) * 8.0) - 1) << endl << "short int = " << sizeof(short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных short int*/ << (pow(2,sizeof(short int) * 8.0 - 1) - 1) << endl << "unsigned short int = " << sizeof(unsigned short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned short int*/ << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl << "int = " << sizeof(int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных int*/ << (pow(2,sizeof(int) * 8.0 - 1) - 1) << endl << "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned int*/ << (pow(2,sizeof(unsigned int) * 8.0) - 1) << endl << "long int = " << sizeof(long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long int*/ << (pow(2,sizeof(long int) * 8.0 - 1) - 1) << endl << "unsigned long int = " << sizeof(unsigned long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных undigned long int*/ << (pow(2,sizeof(unsigned long int) * 8.0) - 1) << endl << "float = " << sizeof(float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных float*/ << (pow(2,sizeof(float) * 8.0 - 1) - 1) << endl << "long float = " << sizeof(long float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long float*/ << (pow(2,sizeof(long float) * 8.0 - 1) - 1) << endl << "double = " << sizeof(double) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных double*/ << (pow(2,sizeof(double) * 8.0 - 1) - 1) << endl; fout.close(); // программа больше не использует файл, поэтому его нужно закрыть cout << "Данные успешно записаны в файл data_types.txt\n"; system("pause"); return 0; }

Nemoguće je ne primijetiti da su promjene u programu minimalne, a sve zahvaljujući činjenici da se standardni input/output i file input/output koriste na potpuno isti način. Na kraju programa, ured 45Eksplicitno smo zatvorili fajl, iako to nije neophodno, ali se smatra dobrom programskom praksom. Vrijedi napomenuti da su sve funkcije i manipulatori koji se koriste za formatiranje standardnog ulaza/izlaza također relevantni za unos/izlaz datoteka. Prema tome, nije došlo do greške prilikom naredbe cout je zamijenjen objektom fout.

Najbolji članci na ovu temu