Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

C shkrim në një skedar teksti. Leximi dhe shkrimi i një skedari

Më parë, gjatë futjes dhe daljes së të dhënave, ne kemi punuar me transmetime standarde - tastierë dhe monitor. Tani le të shohim se si gjuha C zbaton marrjen e të dhënave nga skedarët dhe shkrimin e tyre atje. Përpara se të mund të kryeni këto operacione, duhet të hapni skedarin dhe ta aksesoni atë.

Në gjuhën e programimit C, një tregues për një skedar është i llojit FILE dhe deklarata e tij duket si kjo:
FILE *myfile;

Nga ana tjetër, funksioni fopen() hap një skedar në adresën e specifikuar si argumenti i parë në modalitetin read ("r"), shkrim ("w") ose shtoj ("a") dhe kthen një tregues në të. te programi. Prandaj, procesi i hapjes së një skedari dhe lidhjes së tij me programin duket diçka si kjo:
myfile = fopen ("hello.txt", "r");

Kur lexoni ose shkruani të dhëna në një skedar, ai aksesohet përmes një treguesi skedari (në këtë rast, myfile).

Nëse për një arsye ose një tjetër (nuk ka skedar në adresën e specifikuar, qasja në të refuzohet) funksioni fopen() nuk mund ta hapë skedarin, atëherë ai kthen NULL. Në programet reale, ata pothuajse gjithmonë trajtojnë një gabim në hapjen e skedarit në degën if, por ne do ta heqim këtë më tej.

Deklarata e funksionit fopen() gjendet në skedarin e kokës stdio.h, kështu që duhet të përfshihet. Gjithashtu në stdio.h deklarohet lloji i strukturës FILE.

Pas përfundimit të punës me një skedar, është zakon ta mbyllni atë për të çliruar buferin nga të dhënat dhe për arsye të tjera. Kjo është veçanërisht e rëndësishme nëse programi vazhdon të funksionojë pas punës me skedarin. Ndërprerja e lidhjes ndërmjet një skedari të jashtëm dhe një treguesi në të nga programi bëhet duke përdorur funksionin fclose(). Një tregues në skedar i kalohet atij si parametër:
fclose (myfile);

Më shumë se një skedar mund të hapet në program. Në këtë rast, çdo skedar duhet të shoqërohet me treguesin e tij të skedarit. Megjithatë, nëse programi fillimisht punon me një skedar dhe më pas e mbyll atë, atëherë treguesi mund të përdoret për të hapur një skedar të dytë.

Leximi nga dhe shkrimi në një skedar teksti

fscanf ()

Funksioni fscanf() është i ngjashëm në kuptim me funksionin scanf(), por ndryshe nga ai, ai ofron hyrje të formatuar nga një skedar dhe jo hyrje standarde. Funksioni fscanf() merr parametrat: treguesin e skedarit, vargun e formatit, adresat e zonave të memories për shkrimin e të dhënave:
fscanf(myfile, "%s%d", str, &a);

Kthen numrin e të dhënave të lexuara me sukses ose EOF. Hapësirat dhe karakteret e linjës së re numërohen si ndarës të të dhënave.

Le të themi se kemi një skedar që përmban përshkrimin e mëposhtëm të objekteve:

Mollë 10 23,4 banane 5 25,0 bukë 1 10,3

#përfshi kryesore () ( FILE * file; struct food ( char emri[ 20 ] ; sasia e panënshkruar; çmimi float; ) ; struct shop food[ 10 ] ; char i= 0 ; file = fopen ( "fscanf.txt" , "r" ) ; ndërsa (fscanf (skedar, "%s%u%f" , shop[ i].emri , & (dyqan[ i].qty ) , & (dyqan[ i].çmimi ) ) != EOF) ( printf ("%s %u %.2f \n", shop[ i].emri, dyqani[ i].sasia, dyqani[ i].çmimi); i++; ) )

Në këtë rast, deklarohen një strukturë dhe një grup strukturash. Çdo rresht nga skedari korrespondon me një element të grupit; një element vargu është një strukturë që përmban një varg dhe dy fusha numerike. Cikli lexon një rresht për përsëritje. Kur ndeshet fundi i skedarit, fscanf() kthen EOF dhe cikli përfundon.

fgets ()

Funksioni fgets() është i ngjashëm me funksionin gets() dhe kryen hyrjen rresht pas rreshti nga një skedar. Një thirrje në fgets() do të lexojë një rresht. Në këtë rast, nuk mund të lexoni të gjithë rreshtin, por vetëm një pjesë të tij nga fillimi. parametrat fgets () duken kështu:
fgets (array_karakteresh, numri_e_karaktereve_lexuar, treguesi_tek_skedari)

Për shembull:
fgets (str, 50, myfile)

Kjo thirrje funksioni do të lexojë nga skedari i lidhur me treguesin myfile një rresht të plotë teksti nëse gjatësia e tij është më pak se 50 karaktere, duke përfshirë karakterin "\n", të cilin funksioni do ta ruajë gjithashtu në një grup. Elementi i fundit (50) i grupit str do të jetë karakteri "\0" i shtuar nga fgets() . Nëse vargu është më i gjatë, funksioni do të lexojë 49 karaktere dhe do të shkruajë "\0" në fund. Në këtë rast, "\n" nuk do të përmbahet në rreshtin e leximit.

#përfshi #define N 80 kryesore () ( FILE * skedar; char arr[ N] ; skedar = fopen ( "fscanf.txt" , "r" ) ; ndërsa (fgets (arr, N, skedar) != NULL) printf (" %s" , arr) ; printf (" \n") ; fclose(file); )

Në këtë program, ndryshe nga ai i mëparshmi, të dhënat lexohen rresht pas rreshti në grupin arr. Kur lexohet rreshti tjetër, ai i mëparshmi humbet. Funksioni fgets() kthen NULL nëse nuk mund të lexojë rreshtin tjetër.

getc () ose fgetc ()

Funksioni getc() ose fgetc() (të dyja funksionojnë) ju lejon të merrni karakterin tjetër të vetëm nga një skedar.

ndërsa ((arr[ i] = fgetc (skedar) ) != EOF) ( nëse (arr[ i] == " \n") (arr[i] = " \0 " ; printf("%s \n", arr) ; i = 0; ) tjetër i++; )arr[i] = " \0 " ; printf("%s \n", arr) ;

Kodi i shembullit shfaq të dhëna nga një skedar në ekran.

Shkrimi në një skedar teksti

Ashtu si hyrja, dalja në një skedar mund të jetë e ndryshme.

  • Prodhimi i formatuar. Funksioni fprintf (indeksi_skedar, vargu_format, variablat) .
  • Prodhimi post-pas-line. Funksioni fputs (string, file_pointer) .
  • Prodhimi karakter pas karakteri. Funksioni fputc() ose putc(simbol, file_pointer) .

Më poshtë janë shembuj kodesh që përdorin tre metoda të nxjerrjes së të dhënave në një skedar.

Shkrimi i fushave të një strukture në çdo rresht të skedarit:

file = fopen ("fprintf.txt", "w"); ndërsa (scanf ("%s%u%f" , shop[ i].emri , & (dyqan[ i].qty ) , & (dyqan[ i].çmimi ) ) != EOF) ( fprintf (skedar, " %s %u %.2f \n", shop[ i].emri, dyqani[ i].sasia, dyqani[ i].çmimi); i++; )

Dalja rresht pas rreshti në një skedar (fputs(), ndryshe nga vetë puts(), nuk vendos "\n" në fund të rreshtit):

ndërsa (merr (arr) != NULL) (fputs (arr, skedar); fputs (" \n", skedar); )

Shembull i daljes karakter pas karakteri:

ndërsa ((i = getchar () ) != EOF) putc (i, skedar) ;

Leximi nga dhe shkrimi në një skedar binar

Ju mund të punoni me një skedar jo si një sekuencë karakteresh, por si një sekuencë bajtash. Në parim, nuk është e mundur të punohet me skedarë jo-tekst në ndonjë mënyrë tjetër. Megjithatë, ju mund të lexoni dhe shkruani në skedarë teksti në këtë mënyrë. Avantazhi i kësaj metode të qasjes në një skedar është shpejtësia e leximit-shkrimit: një bllok i rëndësishëm informacioni mund të lexohet/shkruhet në një akses.

Kur hapni një skedar për qasje binar, parametri i dytë për fopen() është vargu "rb" ose "wb".

Tema e punës me skedarë binare është mjaft komplekse dhe kërkon një mësim të veçantë për ta studiuar atë. Këtu do të shënohen vetëm veçoritë e funksioneve të leximit dhe shkrimit në një skedar, i cili konsiderohet si një rrjedhë bajt.

Funksionet fread() dhe fwrite() marrin si parametra:

  1. adresa e zonës së memories nga ku shkruhen ose lexohen të dhënat,
  2. madhësia e një të dhënë çdo lloji,
  3. sasia e të dhënave të lexuara të madhësisë së specifikuar,
  4. indeksi i skedarit.

Këto funksione kthejnë numrin e të dhënave të lexuara ose të shkruara me sukses. Ato. ju mund të "porositni" leximin e 50 elementeve të të dhënave, por të merrni vetëm 10. Nuk do të ketë asnjë gabim.

Një shembull i përdorimit të funksioneve fread() dhe fwrite():

#përfshi #përfshi main () ( FILE * skedar; char shelf1[ 50 ], shelf2[ 100 ] ; int n, m; file = fopen ("shelf1.txt" , "rb" ) ; n= fread (raft1, madhësia e (char) , 50 , skedar) ; fclose (skedar) ; skedar = fopen ("shelf2.txt", "rb"); m= fread (raft2, madhësia e (char) , 50, skedari) ; fclose (skedar) ; raft1[ n] = " \0 " ; raft 2[m] = " \n"; raft2[ m+ 1 ] = " \0 " ; file = fopen ("shop.txt", "wb"); fwrite (strcat (raft2, raft1) , madhësia e (char ) , n+ m, skedar) ; fclose(file); )

Këtu tentohet të lexohen 50 karaktere nga skedari i parë. n ruan numrin e karaktereve të lexuara në të vërtetë. Vlera e n mund të jetë 50 ose më pak. Të dhënat vendosen në një rresht. E njëjta gjë ndodh me skedarin e dytë. Më pas, rreshti i parë i bashkëngjitet rreshtit të dytë dhe të dhënat hidhen në skedarin e tretë.

Zgjidhja e problemeve

  1. Shkruani një program që kërkon nga përdoruesi emrin (adresën) e një skedari teksti, pastaj e hap atë dhe numëron numrin e karaktereve dhe rreshtave në të.
  2. Shkruani një program që shkruan në një skedar të dhëna të marra nga një skedar tjetër dhe të modifikuar në një farë mënyre përpara se të shkruani. Çdo rresht i të dhënave të marra nga një skedar duhet të përshtatet në një strukturë.

– krahasimi për të identifikuar barazinë ose pabarazinë.

Qëllimi praktik i një numërimi është të përcaktojë një grup konstantesh simbolike të dallueshme të një lloji të plotë.

Një shembull i përdorimit të variablave të numëruar:

mo=1, tu, ne, th, fr, sa, su ) ditë;

puts(“ Fut ditën e javës (nga 1 në 7) : ”); scanf(“%d”, &t_day);

w_ditë = su; start = mo;

fund = w_ditë -t_ditë;

printf(“\nE hëna është %d dita e javës, \tani është %d dita.\n\

Deri në fund të javës %d ditë (ditë). ”, fillimi, t_dita, fundi);

Rezultati i programit: Shkruani ditën e javës (nga 1 në 7): 2

E hëna është dita e parë e javës, tani është dita e dytë. Kanë mbetur edhe 5 ditë (ditë) deri në fund të javës.

18. Skedarët në gjuhën C

Një skedar është një grup të dhënash të vendosura në media të jashtme dhe të konsideruara si një e tërë e vetme gjatë përpunimit. Skedarët përmbajnë të dhëna të destinuara për ruajtje afatgjatë.

Ekzistojnë dy lloje skedarësh: tekst dhe binar. Skedarët e tekstit janë një sekuencë karakteresh ASCII dhe mund të shikohen dhe modifikohen duke përdorur çdo redaktues teksti.

Skedarët binare (binare) janë një sekuencë të dhënash, struktura e të cilave përcaktohet nga softueri.

Gjuha C ka një grup të madh funksionesh për të punuar me skedarë, shumica e të cilave gjenden në bibliotekat stdio.h dhe io.h.

18.1. Hapja e një skedari

Çdo skedari i caktohet një emër logjik i brendshëm, i cili përdoret më vonë kur qaseni në të. Emri logjik (identifikuesi i skedarit) është

treguesin e skedarit, d.m.th. në një zonë memorie që përmban të gjithë informacionin e nevojshëm për skedarin. Formati për deklarimin e një treguesi në një skedar është si më poshtë:

FILE * tregues për skedar;

FILE – identifikuesi i llojit të strukturës i përshkruar në bibliotekën standarde

stdio.h dhe që përmban informacionin e mëposhtëm:

shkruani struct(

– numri i bajteve të palexuara të mbetura në bufer;

madhësia e zakonshme e buferit është 512 bajt; sapo niveli=0,

blloku tjetër i të dhënave lexohet në bufer nga skedari;

– flamuri i statusit të skedarit – lexo, shkruaj, shto;

– përshkruesi i skedarit, d.m.th. numri që përcakton jo-

char mbajë e panënshkruar;

– karakter i patransmetuar, d.m.th. ungetc-karakter;

– madhësia e tamponit të ndërmjetëm të brendshëm;

tampon char i panënshkruar;

– vlera e treguesit për akses brenda buferit, d.m.th.

specifikon fillimin e buferit, fillimin e rreshtit ose vlerën aktuale

Vlera e treguesit brenda buferit në varësi të modalitetit

ma buffering;

i panënshkruar char *curp;

– vlera aktuale e treguesit për qasje brenda

fera, d.m.th. specifikon pozicionin aktual në buferin e shkëmbimit

në vazhdim me programin;

stem i panënshkruar;

– flamuri i skedarit të përkohshëm;

– flamur kur punoni me një skedar;

) DOSJE;

Para se të filloni të punoni me skedarin, d.m.th. Për të qenë në gjendje të lexoni ose shkruani informacion në një skedar, ai duhet të hapet për qasje. Për këtë qëllim zakonisht përdoret funksioni

FILE* fopen (char* emri_skedar, char* modaliteti);

merr një paraqitje të jashtme - emrin fizik të një skedari në një medium (disketë, hard disk) dhe e përputh atë me një emër logjik.

Emri fizik, d.m.th. emri i skedarit dhe rruga drejt tij janë të specifikuara nga parametri i parë

- një rresht, për shembull, "a:Mas_dat.dat" - një skedar i quajtur Mas_dat.dat i vendosur në një disketë, "d:\\work\\Sved.txt" - një skedar me emrin Sved.txt i vendosur në hard drive në drejtorinë e punës.

Kujdes! Viza e prapme (\), si karakter special, shkruhet dy herë në rresht.

Pas hapjes me sukses, funksioni fopen kthen një tregues në skedar (në tekstin e mëtejmë referuar si treguesi i skedarit). Në rast gabimi, NULL kthehet. Kjo situatë zakonisht ndodh kur shtegu i skedarit që do të hapet është specifikuar gabimisht. Për shembull, nëse në klasën e ekranit të universitetit tonë ju specifikoni një shteg që është i ndaluar për shkrim (zakonisht lejohet d:\work\).

Parametri i dytë është një rresht që specifikon mënyrën e hyrjes në skedar:

w – dosja hapet për shkrim; nëse nuk ka skedar me emrin e dhënë, ai do të krijohet; nëse ekziston një skedar i tillë, atëherë informacioni i mëparshëm shkatërrohet para hapjes;

r – skedari hapet vetëm për lexim; nëse nuk ka një skedar të tillë, ndodh një gabim;

a – dosja hapet për të shtuar informacione të reja në fund;

r+ - skedari hapet për redaktimin e të dhënave - është e mundur të shkruani dhe lexoni informacionin;

w+ – njëjtë si për r+;

a+ – njësoj si për a, vetëm shkrimi mund të bëhet kudo në skedar; leximi i skedarëve është gjithashtu i disponueshëm;

t – skedari hapet në modalitetin e tekstit; b – skedari hapet në modalitetin binar.

Modaliteti i tekstit ndryshon nga modaliteti binar në atë që kur një skedar hapet si tekst, çifti i karaktereve "ushqimi i linjës", "kthimi i transportit" zëvendësohet nga një karakter i vetëm: "ushqimi i linjës" për të gjitha funksionet për shkrimin e të dhënave në skedar. , dhe për të gjitha funksionet e daljes, karakteri "linjë furnizim" " zëvendësohet tani me dy karaktere: "ushqimi i linjës", "kthimi i transportit".

Si parazgjedhje, skedari hapet në modalitetin e tekstit. Shembull: FILE *f; – deklarohet një tregues për skedarin f;

f = fopen("d:\\work\\Dat_sp.cpp", "w"); – hapet për shkrim një skedar me emrin logjik f, i cili ka emrin fizik Dat_sp.cpp, i vendosur në diskun d, në drejtorinë e punës; ose më shkurt

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

18.2. Mbyllja e një skedari

Pas punës me një skedar, qasja në të duhet të mbyllet. Kjo realizohet nga funksioni int fclose (treguesi i skedarit). Për shembull, nga shembulli i mëparshëm, skedari mbyllet kështu: fclose (f);

Për të mbyllur shumë skedarë, futet një funksion, i deklaruar si më poshtë: void fcloseall (void);

Nëse keni nevojë të ndryshoni modalitetin e hyrjes për një skedar, fillimisht duhet ta mbyllni skedarin dhe më pas ta hapni përsëri, por me të drejta të ndryshme aksesi. Për ta bërë këtë, përdorni funksionin standard:

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

Ky funksion fillimisht mbyll skedarin e deklaruar file_pointer(siç bën funksioni fopen), dhe më pas hap skedarin me emrin e skedarit dhe lejet "mode".

Gjuha C ka aftësinë për të punuar me skedarë të përkohshëm që nevojiten vetëm kur programi është duke u ekzekutuar. Në këtë rast përdoret funksioni

FILE* tmpfile(void);

i cili krijon një skedar të përkohshëm në disk me të drejta aksesi “w+b”, pasi programi të përfundojë ose pasi skedari i përkohshëm është mbyllur, ai fshihet automatikisht.

18.3. Shkruani - lexoni informacionin

Të gjitha veprimet për leximin dhe shkrimin e të dhënave në një skedar mund të ndahen në tre grupe: operacione hyrje-dalje karakter pas karakteri; operacionet I/O linjë pas rreshti; bllokojnë operacionet I/O.

Le të shohim funksionet kryesore të përdorura në secilin prej këtyre tre grupeve të operacioneve.

I/O karakter pas karakteri

Në funksionet I/O karakter pas karakteri, një karakter merret nga një skedar ose një karakter dërgohet në një skedar:

Rreshti I/O

Funksionet e linjës I/O transferohen nga një skedar ose në

Blloko I/O

Funksionet e bllokut I/O funksionojnë në blloqe të tëra

informacion:

int fread (void*p, intsize,

– lexon n blloqe me madhësi bajt secili nga skedari

int n, FILE *f)

la f në një zonë memorie me tregues p (kërkohet

int fwrite (void*p, intsize,

caktoni memorie paraprakisht për bllokun që do të lexohet);

– shkruan n blloqe me madhësi bajte secili nga

int n, FILE *f)

zona e memories me tregues p në skedarin f.

I/O e formatuar prodhohet nga funksionet.

Ne kemi mësuar tashmë se si të shkruajmë informacion në një skedar teksti. – Nëse nuk e keni mësuar se si, shihni artikullin e mëparshëm. Tregohet dhe përshkruhet në detaje

Por, çka nëse skedari tashmë ekziston dhe ne duhet të lexojmë informacion prej tij për përpunim? Për fat të mirë, kjo është gjithashtu mjaft e thjeshtë. Më lejoni t'ju kujtoj se ka disa opsione për zbatimin e kësaj detyre; unë kam përshkruar vetëm një prej tyre. Ai i përshkruar është ai që për disa arsye mua personalisht më duket më i lehtë për t'u kuptuar.

#përfshi

int main()
{
char s1 //Ndryshorja do të lexojë vargun
ifstream in (“C:\\\FromC\\myfile.txt”); //Hapni skedarin për të lexuar informacionin
në >>s1 ; //lexoni rreshtin
in.close() // Mbyllja e skedarit

cout<Nxjerr vlerën s1 në ekran
kthimi 0;
}

Këtu është programi më i thjeshtë për të lexuar rreshtin e parë nga një skedar teksti i vendosur përgjatë shtegut
C:\\\FromC\\myfile.txt –
Meqenëse ky është një vazhdim i artikullit të mëparshëm, vendosa të përdor skedarin që krijuam atje. Ndoshta nuk duhet të ketë ndonjë vështirësi me këtë.
Por le të kthehemi te kodi. Fillimisht hapim skedarin për të lexuar informacion prej tij, për këtë përdorim komandën ifstream në kllapa tregojmë ose emrin e skedarit ose rrugën drejt skedarit, siç bëra unë. (“C:\\\FromC\\myfile.txt”);
Kur hapëm një skedar për të lexuar diçka prej tij, ne deklaruam një variabël si karakter -
karakteri s1
Tani gjithçka që duhet të bëjmë është t'i caktojmë variablit vlerën e vargut nga skedari. Ne e bëjmë këtë si një ekip
Kushtojini vëmendje kllapave këndore në >>
Në fakt, siç duhet të jetë e qartë nga komentet në kodin e programit, në mënyrë që ndryshorja të caktojë vlerën e leximit, ne duhet ta shkruajmë atë pas në >>
në >>s1 ;

Kjo nuk duket të jetë një detyrë veçanërisht e vështirë, veçanërisht nëse tashmë e keni zotëruar dhe mësuar të përdorni materialin nga artikulli i mëparshëm - gjithçka është absolutisht e njëjtë, vetëm 2 komanda janë të ndryshme

Krijimi i një skedari dhe shkrimi i informacionit C++ në të

të rrjedhës jashtë ( Emri i skedarit );
jashtë<< (Varg për t'u shkruar);
jashtë.mbyll();
=============================

Leximi i tekstit nga një skedar dhe printimi i tekstit në ekran në C++

ifstream (Emri i skedarit);
>> (Duke lexuar rreshtin);
.mbyll();(Mbyll skedarin)
============================
Le të shkruajmë një program të thjeshtë që do të lexojë hyrjen e tekstit nga tastiera dhe do ta shkruajë atë në një skedar:

#përfshi
#përfshi

int main()
{
\\ 3 linja të ardhshme
clrscsr(); // Pastrimi i ekranit

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

/*Filloni të punoni me skedarin*/
outstream out (“C:\\\FromC\\myfile.txt”); //Hapja e një skedari për të shkruar
jashtë<Shkruani rreshtin e parë
jashtë<Shkruani rreshtin e dytë
jashtë<Shkruani rreshtin e tretë
out.close(); // Mbyllja e skedarit

//Rivendosja e variablave

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


ifstream in("C:\\\FromC\\myfile.txt");
në >>a >>b >>c ; //Ne lexojmë çdo rresht të ri në një ndryshore të re
in.close(); // Mbyllja e skedarit

/* */

për (i =0 ;a !=*“” ;i ++)
{
nëse (i > madhësia e (a )) pushim ;
cout<

}
cout<<“\n” ; \\

/* */


{
nëse (i > madhësia e (b)) pushim ;
cout<
}
cout<<“\n” ; \\ Zhvendos kursorin në një rresht të ri

/* */

për (i =0 ;с !=*“” ;i ++)
{
nëse (i > madhësia e (c )) pushim ;
cout<<с ;
}

kthimi 0;
}
===================

Në shembujt e mësipërm ka një të tillë E MADHE e metë. Nëse përpiqemi të fusim një rresht që përmban hapësira, programi nuk do të funksionojë siç duhet. Ndoshta, jo vetëm unë, por edhe shumë njerëz të tjerë hasëm në këtë gabim. Prandaj, unë lë kodin e pasaktë në mënyrë që të shihni se çfarë mund të hasni.

Meqenëse nuk ka libra në shtëpi, unë përsëri fillova të kontrolloj internetin dhe gjeta shumë lloj-lloj marrëzish të sofistikuara. Por disi gjeta një zgjidhje për problemin tim.
Më ndihmoi që e lexova cout mbështet metodat e tij. Dhe në internet të gjitha këshillat shkojnë drejt përdorimit të funksionit linjë të marrë Për fatin tim, zbulova se si ta përdor këtë funksion shumë shpejt dhe më pas e përdora në kod.
Në përgjithësi, ia vlen të përmendet dhe të përshkruhet ky funksion, por deri më tani nuk e kuptoj vërtet, thjesht e kuptoj që duhet të përdoret dhe e kuptoj se si, kështu që do të jap një shembull më të saktë të programit tonë që po zhvillohet. :

#përfshi
#përfshi

int main()
{
karakter a,b,c; \\ 3 linja të ardhshme
clrscsr(); // Pastrimi i ekranit

/* Futni vlerat për variablat*/

cout<<“Wwedi pervuu stroku” ; cin.getline(a,madhësia e(a)); endl ;
cout<<“Wwedi wtoruu stroku” ; cin.getline(a,madhësia e(b)); endl ;
cout<<“Wwedi tretuu stroku” ; cin.getline(a,madhësia e(c)); endl ;
clrscr(); //Pas futjes së vlerave, ekrani u fshi

/*Filloni të punoni me skedarin*/
outstream out ("C:\\\FromC\\myfile.txt"); // Hapja e një skedari për të shkruar
jashtë<
Shkruani rreshtin e parë
jashtë<Shkruani rreshtin e dytë
jashtë<Shkruani rreshtin e tretë
out.close(); // Mbyllja e skedarit

//Rivendosja e variablave

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

/*Vazhdo të punosh me skedarin*/

nëse transmetoni në ("C:\\\FromC\\myfile.txt");
in.getline(a,madhësia e(a));// A
in.getline(b,madhësia e(b));// Leximi i një rreshti në një ndryshore b
in.getline(c,madhësia e(c)); // Leximi i një rreshti në një ndryshore c
in.close(); // Mbyllja e skedarit

/* Ne lexojmë rreshtin e parë karakter për karakter dhe e shfaqim atë në ekran */

për (i =0 ;a !=*“” ;i++)
{
nëse (i > madhësia e (a )) pushim ;
cout<

}
cout<<“\n” ; \\ Zhvendos kursorin në një rresht të ri

/* Ne lexojmë rreshtin e dytë karakter për karakter dhe e shfaqim atë në ekran */

për (i =0 ;b !=*“” ;i ++)
{
nëse (i > madhësia e (b)) pushim ;
cout<
}
cout<<“\n” ; \\ Zhvendos kursorin në një rresht të ri

/* Ne lexojmë rreshtin e tretë karakter për karakter dhe e shfaqim atë në ekran */

për (i =0 ;с !=*“” ;i++)
{
nëse (i> madhësia e (c)) pushim ;
cout<<с[i];
}

getch(); \\Pritet që tasti Enter të shtypet
kthimi 0;
}
===================

Ky material përshkruan një shembull të leximit karakter pas karakteri të informacionit. Meqenëse nuk e përshkrova punën me variabla si karakter, atëherë fillestarët mund të përjetojnë disa shqetësime në kuptimin e kodit. Thjesht nuk e dija se çfarë lloji karakter ka disa veçori dhe mendoi se gjithçka ishte më e thjeshtë. Prandaj, disa momente të pakuptueshme të programit të mësipërm mund të lexohen në artikullin e mëposhtëm duke punuar me char V C++ për fillestarët

Përndryshe, shembulli i dhënë se si të lexohen rreshtat nga një skedar teksti në C++ duhet të jetë i arritshëm dhe mjaft i kuptueshëm. Ky nuk është opsioni optimal i zbatimit për momentin, dhe më kanë humbur disa pika të rëndësishme, por duke qenë se po fillojmë të mësojmë gjuhën C++, kjo është mjaft e mjaftueshme për momentin. Më vonë ndoshta do të arrij në atë që më ka munguar, por tani më duhet të perceptoj vetëm më të nevojshmen.

Nëse ju dhe unë e kuptojmë këtë material, do të thotë se kemi bërë një hap të vogël drejt profesionalizmit tonë.

Shënim:
pushim ;– Kjo është komanda që del nga cikli. Kemi nëse numëruesi i ciklit për bëhet më e madhe se madhësia e deklaruar e ndryshores karamel, atëherë me forcë dalim nga laku
!= – Ky është kushti që kemi vendosur. Ky kusht shënohet me pabarazi
nëse (a !=b)– Lexon sikur a jo të barabartë b

endl ; - Kjo po lëviz kursorin në një linjë të re brenda tastierës (me sa kuptoj unë)
Kjo komandë është e ngjashme me "\n"

Përditësimi i fundit: 10/31/2015

Klasa FileStream përfaqëson aftësitë e leximit nga një skedar dhe shkrimi në një skedar. Kjo ju lejon të punoni me skedarë teksti dhe binar.

Le të shqyrtojmë vetitë dhe metodat e tij më të rëndësishme:

    Vetia e gjatësisë: kthen gjatësinë e rrymës në bajt

    Vetia e pozicionit: kthen pozicionin aktual në transmetim

    Metoda e leximit: Lexon të dhënat nga një skedar në një grup bajt. Merr tre parametra: int Read (array byte, int offset, int count) dhe kthen numrin e bajteve të lexuara me sukses. Këtu përdoren parametrat e mëposhtëm:

    • array - një grup bajtësh ku do të vendosen të dhënat e lexuara nga skedari

      offset përfaqëson kompensimin në bajt në grupin në të cilin do të vendosen bajtët e lexuar

      count - numri maksimal i bajteve për t'u lexuar. Nëse ka më pak bajt në skedar, atëherë të gjithë do të lexohen.

    Metoda Kërkimi i gjatë (offset i gjatë, Origjina e SeekOrigjinës): vendos pozicionin në rrymë me një zhvendosje nga numri i bajteve të specifikuara në parametrin e kompensimit.

    Metoda e shkrimit: Shkruan të dhëna nga një grup bajt në një skedar. Merr tre parametra: Write (vargu byte, int offset, int count)

    • array - një grup bajtësh nga i cili të dhënat do të shkruhen në skedar

      offset - zhvendosja në bajt në grup nga ku bajtet fillojnë të shkruhen në rrjedhë

      count - numri maksimal i bajteve për t'u shkruar

FileStream përfaqëson aksesin e skedarit në nivelin e bajtit, kështu që, për shembull, nëse ju duhet të lexoni ose shkruani një ose më shumë rreshta në një skedar teksti, atëherë grupi i bajtit duhet të konvertohet në vargje duke përdorur metoda të veçanta. Prandaj, klasat e tjera përdoren për të punuar me skedarë teksti.

Në të njëjtën kohë, kur punoni me skedarë të ndryshëm binare që kanë një strukturë të caktuar, FileStream mund të jetë shumë i dobishëm për nxjerrjen e pjesëve të caktuara të informacionit dhe përpunimin e tij.

Le të shohim një shembull të leximit dhe shkrimit në një skedar teksti:

Console.WriteLine("Fut një rresht për të shkruar në skedar:"); teksti i vargut = Console.ReadLine(); // shkrimi në një skedar duke përdorur (FileStream fstream = ri FileStream(@"C:\SomeDir\noname\note.txt", FileMode.OpenOrCreate)) ( // konverto vargun në grup bajt bajt = System.Text.Encoding. e parazgjedhur. GetBytes(tekst); // shkrimi i një grupi bajtësh në një skedar fstream.Write(array, 0, array.Length); Console.WriteLine ("Tekst i shkruar në skedar"); ) // lexim nga një skedar duke përdorur (FileStream fstream = File. OpenRead(@"C:\SomeDir\noname\note.txt")) ( // konverto vargun në bajt varg bajt = bajt i ri; // lexo të dhënat fstream.Read(array, 0, array.Length); // deshifroni bajtet në vargun tekstiFromFile = System.Text.Encoding.Default.GetString(array); Console.WriteLine ("Tekst nga skedari: (0)", textFromFile); ) Console.ReadLine() ;

Le të shohim këtë shembull. Si leximi ashtu edhe shkrimi përdorin deklaratën e përdorimit. Kjo deklaratë nuk duhet të ngatërrohet me direktivën e përdorimit, e cila përfshin hapësirat e emrave në fillim të skedarit të kodit. Deklarata e përdorimit ju lejon të krijoni një objekt në një bllok kodi, pas përfundimit të të cilit thirret metoda Dispose e atij objekti, dhe kështu objekti shkatërrohet. Në këtë rast, ndryshorja fstream shërben si një objekt i tillë.

Objekti fstream krijohet në dy mënyra të ndryshme: përmes konstruktorit dhe përmes njërës prej metodave statike të klasës File.

Këtu dy parametra i kalohen konstruktorit: shtegu i skedarit dhe numërimi i FileMode. Ky numërim tregon mënyrën e hyrjes në skedar dhe mund të marrë vlerat e mëposhtme:

    Shtoj: nëse skedari ekziston, teksti shtohet në fund të skedarit. Nëse skedari nuk ekziston, ai krijohet. Skedari hapet vetëm për shkrim.

    Krijo: Krijohet një skedar i ri. Nëse një skedar i tillë ekziston tashmë, ai mbishkruhet

    CreateNew: Krijohet një skedar i ri. Nëse një skedar i tillë ekziston tashmë, atëherë aplikacioni hedh një gabim

    Hap: Hap një skedar. Nëse skedari nuk ekziston, bëhet një përjashtim

    OpenOrCreate: nëse skedari ekziston, ai hapet, nëse jo, krijohet një i ri

    Shkurtim: Nëse skedari ekziston, ai mbishkruhet. Skedari hapet vetëm për shkrim.

Metoda statike OpenRead e klasës File hap një skedar për lexim dhe kthen një objekt FileStream.

Konstruktori i klasës FileStream ka gjithashtu një numër mbingarkimesh që ju lejojnë të personalizoni më saktë objektin që krijohet. Të gjitha këto versione mund të shihen në msdn.

Si shkrimi ashtu edhe leximi përdorin objektin kodues Encoding.Default nga hapësira e emrave System.Text. Në këtë rast, ne përdorim dy nga metodat e tij: GetBytes për të marrë një varg byte nga një varg dhe GetString për të marrë një varg nga një grup bajt.

Si rezultat, vargu që kemi futur është shkruar në skedar shënim.txt. Në thelb, ky është një skedar binar (jo një skedar teksti), megjithëse nëse shkruajmë vetëm një rresht në të, mund ta shohim këtë skedar në një formë të lexueshme nga njeriu duke e hapur atë në një redaktues teksti. Sidoqoftë, nëse shkruajmë bajt të rastësishëm në të, për shembull:

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

Atëherë mund të kemi probleme për ta kuptuar atë. Prandaj, klasa të veçanta janë krijuar për të punuar drejtpërdrejt me skedarët e tekstit - StreamReader dhe StreamWriter.

Qasje e rastësishme në skedarë

Shpesh skedarët binare përfaqësojnë një strukturë specifike. Dhe, duke e ditur këtë strukturë, ne mund të marrim informacionin e nevojshëm nga skedari ose, anasjelltas, të shkruajmë një grup të caktuar bajtësh në një vend të caktuar në skedar. Për shembull, në skedarët wav, vetë të dhënat audio fillojnë me 44 bajt, dhe deri në 44 bajt ka meta të dhëna të ndryshme - numri i kanaleve audio, frekuenca e mostrës, etj.

Duke përdorur metodën Seek(), ne mund të kontrollojmë pozicionin e kursorit të transmetimit, nga i cili lexohet ose shkruhet skedari. Kjo metodë merr dy parametra: kompensimin dhe pozicionin në skedar. Një pozicion në një skedar përshkruhet nga tre vlera:

    SeekOrigin.Begin: fillimi i skedarit

    SeekOrigin.End: fundi i skedarit

    SeekOrigin.Current : pozicioni aktual në skedar

Kursori i rrymës nga fillon leximi ose shkrimi zhvendoset përpara me zhvendosje në lidhje me pozicionin e specifikuar si parametër i dytë. Kompensimi mund të jetë negativ, atëherë kursori lëviz prapa, nëse pozitiv, atëherë përpara.

Le të shohim një shembull:

Duke përdorur System.IO; duke përdorur System.Text; klasë Programi ( static void Main (string args) ( string text = "hello world"; // shkrim në një skedar duke përdorur (FileStream fstream = new FileStream(@"D:\note.dat", FileMode.OpenOrCreate)) ( / / konverto vargun në bajt, hyrjen e bajtit = Encoding.Default.GetBytes(tekst); // shkruaj një grup bajtësh në një skedar fstream.Write(input, 0, input.Length); Console.WriteLine("Tekst i shkruar në skedar "); // zhvendosni treguesin në fund të skedarit, pesë bajt në fund të skedarit fstream.Seek(-5, SeekOrigin.End); // minus 5 karaktere nga fundi i transmetimit // lexoni katër karaktere nga pozicioni aktual prodhimi i bajtit = bajt i ri; fstream.Lexo (dalja, 0, dalja. Gjatësia); // dekodoni bajtet në një varg tekstiFromFile = Encoding.Default.GetString(output); Console.WriteLine("Tekst nga skedari: (0)", textFromFile); // worl // zëvendësoni në skedar fjalën botë me fjalën house string replaceText = "house"; fstream.Seek(-5, SeekOrigin.End); // minus 5 karaktere nga fundi i hyrjes së transmetimit = Encoding.Default.GetBytes(replaceText);fstream.Write(input , 0, input.Length); // lexo të gjithë skedarin // ktheje treguesin në fillim të skedarit fstream.Seek(0, SeekOrigin.Begin); output = bajt i ri; fstream.Read(output, 0, output.Length); // dekodoni bajtet në një varg tekstFromFile = Encoding.Default.GetString(output); Console.WriteLine("Tekst nga skedari: (0)", tekstFromFile); // hello house ) Console.Read(); ) )

Dalja e konsolës:

Teksti i shkruar në skedar Teksti nga skedari: worl Teksti nga skedari: hello house

Thirrja e fstream.Seek(-5, SeekOrigin.End) e zhvendos kursorin e transmetimit në fund të skedarëve pesë karaktere prapa:

Kjo do të thotë, pasi të shkruani rreshtin "hello world" në një skedar të ri, kursori do të jetë në pozicionin e karakterit "w".

Pas kësaj, ne lexojmë katër bajt duke filluar me karakterin "w". Në këtë kodim, 1 karakter do të përfaqësojë 1 bajt. Prandaj, leximi i 4 bajteve do të jetë i barabartë me leximin e katër karaktereve: "worl".

Pastaj, përsëri, kalojmë në fund të skedarit, duke mos arritur në fundin e pesë karaktereve (d.m.th., përsëri nga pozicioni i karakterit "w") dhe shkruajmë vargun "shtëpi". Pra, vargu "shtëpi" zëvendëson vargun "botë".

Mbyllja e një teme

Në shembujt e mësipërm, një konstrukt që përdor përdoret për të mbyllur një rrymë. Pasi të jenë përpunuar të gjithë operatorët dhe shprehjet në bllokun e përdorimit, objekti FileStream shkatërrohet. Sidoqoftë, ne mund të zgjedhim një mënyrë tjetër:

FileStream fstream = null; provo ( fstream = ri FileStream(@"D:\note3.dat", FileMode.OpenOrCreate); // operacionet me transmetimin ) catch(Exception ex) ( ) në fund ( if (fstream != null) fstream.Close() ;)

Nëse nuk përdorim konstruktin e përdorimit, atëherë duhet të thërrasim në mënyrë eksplicite metodën Close(): fstream.Close()

Shumica e programeve kompjuterike punojnë me skedarë, dhe për këtë arsye ekziston nevoja për të krijuar, fshirë, shkruar, lexuar, hapur skedarë. Çfarë është një skedar? Një skedar është një grup i emërtuar bajtësh që mund të ruhen në disa pajisje ruajtëse. Epo, tani është e qartë se një skedar nënkupton një sekuencë të caktuar bajtësh që ka emrin e vet unik, për shembull file.txt. Skedarët me të njëjtët emra nuk mund të vendosen në të njëjtin drejtori. Emri i skedarit i referohet jo vetëm emrit të tij, por edhe shtrirjes së tij, për shembull: file.txt dhe file.dat skedarë të ndryshëm, megjithëse kanë të njëjtin emër. Ekziston një gjë e tillë si emri i plotë i skedarit - kjo është adresa e plotë në drejtorinë e skedarit që tregon emrin e skedarit, për shembull: D:\docs\file.txt. Është e rëndësishme të kuptohen këto koncepte bazë, përndryshe do të jetë e vështirë të punosh me skedarë.

Për të punuar me skedarë, duhet të përfshini një skedar me kokë . janë përcaktuar disa klasa dhe përfshihen skedarët e kokës futja e skedarit dhe prodhimi i skedarit.

Skedari I/O është i ngjashëm me I/O standarde, i vetmi ndryshim është se I/O kryhet në një skedar dhe jo në ekran. Nëse I/O në pajisjet standarde kryhet duke përdorur objektet cin dhe cout, atëherë për të organizuar skedarin I/O mjafton të krijoni objektet tuaja që mund të përdoren në mënyrë të ngjashme me operatorët cin dhe cout.

Për shembull, duhet të krijoni një skedar teksti dhe të shkruani në të rreshtin Working with files në C++. Për ta bërë këtë ju duhet të ndërmerrni hapat e mëposhtëm:

  1. krijoni një objekt të klasës ofstream ;
  2. shoqëroni një objekt të klasës me skedarin që duhet shkruar;
  3. shkruani një rresht në një skedar;
  4. mbyll skedarin.

Pse është e nevojshme të krijohet një objekt ofstream në vend të një objekti ifstream? Sepse ju duhet të shkruani në një skedar, dhe nëse keni nevojë të lexoni të dhëna nga një skedar, do të krijohej një objekt i klasës ifstream.

// krijoni një objekt për shkrim në skedarin e rrjedhës /*emri i objektit*/; // objekt i klasës ofstream

Le ta quajmë objektin "fout". Kjo është ajo që marrim:

Fout jashtë rrjedhës;

Pse na duhet një objekt? Objekti duhet të jetë në gjendje të shkruajë në një skedar. Objekti tashmë është krijuar, por nuk është i lidhur me skedarin në të cilin duhet të shkruhet vargu.

Fout.open ("cppstudio.txt"); // shoqëroni objektin me skedarin

Nëpërmjet operacionit dot, ne fitojmë qasje në metodën e klasës open(), në të cilën tregojmë emrin e skedarit në kllapa. Skedari i specifikuar do të krijohet në drejtorinë aktuale me programin. Nëse ekziston një skedar me të njëjtin emër, skedari ekzistues do të zëvendësohet me një të ri. Pra, skedari është i hapur, gjithçka që mbetet është të shkruani rreshtin e kërkuar në të. Kjo bëhet si kjo:

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

Duke përdorur funksionin stream në lidhje me objektin fout, vargu Puna me skedarë në C++ shkruhet në një skedar. Meqenëse nuk ka më nevojë për ndryshimin e përmbajtjes së skedarit, ai duhet të mbyllet, domethënë, objekti duhet të ndahet nga skedari.

Fout.close(); // mbyll skedarin

Rezultati - u krijua një skedar me rreshtin Puna me skedarë në C++.

Hapat 1 dhe 2 mund të kombinohen, domethënë, në një rresht, të krijoni një objekt dhe ta lidhni atë me një skedar. Kjo bëhet si kjo:

Ofstream fout("cppstudio.txt"); // krijoni një objekt të klasës ofstream dhe shoqëroni atë me skedarin cppstudio.txt

Le të kombinojmë të gjithë kodin dhe të marrim programin e mëposhtëm.

// file.cpp: Përcakton pikën hyrëse për aplikacionin e konsolës. #include "stdafx.h" #include duke përdorur hapësirën e emrave std; int main(int argc, char* argv) ( ofstream fout ("cppstudio.txt"); // krijoni një objekt të klasës ofstream për regjistrim dhe shoqëroni atë me skedarin cppstudio.txt fout<< "Работа с файлами в С++"; // запись строки в файл fout.close(); // закрываем файл system("pause"); return 0; }

Mbetet të kontrolloni nëse programi po funksionon siç duhet dhe për ta bërë këtë, hapni skedarin cppstudio.txt dhe shikoni përmbajtjen e tij, duhet të jetë - Puna me skedarë në C++.

  1. krijoni një objekt të klasës ifstream dhe lidhni atë me skedarin nga i cili do të kryhet leximi;
  2. lexoni skedarin;
  3. mbyll skedarin.
// file_read.cpp: Përcakton pikën hyrëse për aplikacionin e konsolës. #include "stdafx.h" #include #përfshi duke përdorur hapësirën e emrave std; int main(int argc, char* argv) (setlocale(LC_ALL, "rus"); // shfaqja e saktë e shkronjave cirilike; // buffer për ruajtjen e ndërmjetme të tekstit të lexuar nga një skedar ifstream fin ("cppstudio.txt") ; // hapi skedarin për të lexuar fin >><< buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку system("pause"); return 0; }

Programi tregon dy mënyra për të lexuar nga një skedar, e para është përdorimi i operacionit të transferimit në një transmetim, e dyta është përdorimi i funksionit getline () . Në rastin e parë lexohet vetëm fjala e parë dhe në rastin e dytë lexohet një varg me gjatësi 50 karaktere. Por duke qenë se në skedar kanë mbetur më pak se 50 karaktere, lexohen karakteret deri dhe duke përfshirë të fundit. Ju lutemi vini re se duke lexuar herën e dytë (rreshti 17) vazhdoi pas fjalës së parë, dhe jo nga fillimi, pasi fjala e parë u lexua nërreshti 14. Rezultati i programit është paraqitur në Figurën 1.

Puna me skedarë në C++ Për të vazhduar, shtypni çdo tast. . .

Figura 1 - Puna me skedarë në C++

Programi funksionoi si duhet, por kjo nuk ndodh gjithmonë, edhe nëse gjithçka është në rregull me kodin. Për shembull, emri i një skedari joekzistent iu kalua programit ose kishte një gabim në emër. Po pastaj? Në këtë rast, asgjë nuk do të ndodhë fare. Skedari nuk do të gjendet, që do të thotë se nuk do të jetë e mundur të lexohet. Prandaj, përpiluesi do të injorojë linjat ku kryhet puna në skedar. Si rezultat, programi do të dalë siç duhet, por asgjë nuk do të shfaqet në ekran. Duket se ky është një reagim krejtësisht normal ndaj një situate të tillë. Por një përdorues i thjeshtë nuk do të kuptojë se çfarë po ndodh dhe pse rreshti nga skedari nuk u shfaq në ekran. Pra, për të bërë gjithçka shumë të qartë, C++ ofron një funksion të tillë - is_open(), i cili kthen vlera të plota: 1 - nëse skedari është hapur me sukses, 0 - nëse skedari nuk është hapur. Le të modifikojmë programin me hapjen e një skedari, në mënyrë që nëse skedari nuk është i hapur, të shfaqet një mesazh përkatës.

// file_read.cpp: Përcakton pikën hyrëse për aplikacionin e konsolës. #include "stdafx.h" #include #përfshi duke përdorur hapësirën e emrave std; int main(int argc, char* argv) (setlocale(LC_ALL, "rus"); // shfaqja e saktë e shkronjave cirilike; // buffer për ruajtjen e ndërmjetme të tekstit të lexuar nga një skedar ifstream fin ("cppstudio.doc") ; // ( KENI SHQYRT NJË EMËR TË PAVALETË SAKELIT) nëse (!fin.is_open()) // nëse skedari nuk është i hapur cout<< "Файл не может быть открыт!\n"; // сообщить об этом else { fin >>buff; // numëroi fjalën e parë nga skedari cout<< buff << endl; // напечатали это слово fin.getline(buff, 50); // считали строку из файла fin.close(); // закрываем файл cout << buff << endl; // напечатали эту строку } system("pause"); return 0; }

Rezultati i programit është paraqitur në Figurën 2.

Skedari nuk mund të hapet! Për të vazhduar, shtypni çdo buton. . .

Figura 2 - Puna me skedarë në C++

Siç mund të shihet nga Figura 2, programi raportoi se ishte e pamundur të hapej skedari. Prandaj, nëse programi punon me skedarë, rekomandohet të përdorni këtë funksion, is_open(), edhe nëse jeni të sigurt që skedari ekziston.

Mënyrat e hapjes së skedarëve

Mënyrat e hapjes së skedarëve përcaktojnë se si përdoren skedarët. Për të vendosur modalitetin, klasa ios_base ofron konstante që përcaktojnë mënyrën e hapjes së skedarit (shih Tabelën 1).

Mënyrat e hapjes së skedarit mund të vendosen drejtpërdrejt kur krijoni një objekt ose kur thirrni funksionin open(). .

Ofstream fout("cppstudio.txt", ios_base::app); // hapni skedarin për të shtuar informacion në fund të skedarit fout.open("cppstudio.txt", ios_base::app); // hapni skedarin për të shtuar informacion në fund të skedarit

Mënyrat e hapjes së skedarëve mund të kombinohen duke përdorur një operacion logjik në bit ose| , për shembull: ios_base::out | ios_base::trunc - hap një skedar për shkrim pas pastrimit të tij.

Objektet e klasës ofstream, kur shoqërohen me skedarë, përmbajnë si parazgjedhje mënyrat e hapjes së skedarëve ios_base::out | ios_base:: trunc . Kjo do të thotë, skedari do të krijohet nëse nuk ekziston. Nëse skedari ekziston, përmbajtja e tij do të fshihet dhe vetë skedari do të jetë gati për shkrim. Objektet e klasës ifstream, kur shoqërohen me një skedar, kanë mënyrën e paracaktuar të hapjes së skedarit ios_base::in - skedari është i hapur vetëm për lexim. Mënyra e hapjes së skedarit quhet gjithashtu një flamur; për lexueshmëri, ne do ta përdorim këtë term në të ardhmen. Tabela 1 nuk rendit të gjithë flamujt, por këto duhet të jenë të mjaftueshme për të filluar.

Vini re se flamujt ate dhe app janë shumë të ngjashëm në përshkrim, ata të dy e lëvizin treguesin në fund të skedarit, por flamuri i aplikacionit lejon vetëm shkrimin në fund të skedarit dhe flamuri i ate thjesht e zhvendos flamurin deri në fund të skedarit dhe nuk kufizon vendin ku të shkruhet.

Le të zhvillojmë një program që, duke përdorur operacionin sizeof(), do të llogarisë karakteristikat e llojeve kryesore të të dhënave në C++ dhe do t'i shkruajë ato në një skedar. Karakteristikat:

  1. numri i bajteve të alokuara për llojin e të dhënave
  2. vlera maksimale që mund të ruajë një lloj i caktuar i të dhënave.

Skedari duhet të shkruhet në formatin e mëposhtëm:

/* tipi i të dhënave vlera maksimale e bajtit bool = 1 255.00 char = 1 255.00 int i shkurtër = 2 32767.00 int i shkurtër i panënshkruar = 2 65535.00 int = 4 2147483647.00 i panënshkruar 29 int = 4904 i gjatë = 4904 364 7.00 int e gjatë e panënshkruar = 4 4294967295.00 float = 4 2147483647.00 notim i gjatë = 8 9223372036854775800.00 dyfish = 8 9223372036854775800.00 */

Një program i tillë ishte zhvilluar tashmë më herët në seksion, por atje të gjitha informacionet në lidhje me llojet e të dhënave u nxorrën në pajisjen standarde të daljes dhe ne duhet ta ribëjmë programin në mënyrë që informacioni të shkruhet në një skedar. Për ta bërë këtë, duhet të hapni skedarin në modalitetin e shkrimit, me shkurtimin paraprak të informacionit aktual të skedarit ( rreshti 14). Pasi të krijohet skedari dhe të hapet me sukses (rreshtat 16 - 20), në vend të deklaratës cout, në rreshti 22 ne përdorim objektin fout. Kështu, në vend të ekranit, informacioni për llojet e të dhënave do të shkruhet në një skedar.

// write_file.cpp: Përcakton pikën hyrëse për aplikacionin e konsolës. #include "stdafx.h" #include #përfshi // duke punuar me skedarë #include // manipuluesit e hyrjes/daljes duke përdorur hapësirën e emrave std; int main(int argc, char* argv) ( setlocale (LC_ALL, "rus"); // shoqëroni objektin me skedarin dhe hapni skedarin në modalitetin e shkrimit, duke fshirë fillimisht të gjitha të dhënat nga ai ofstream fout("data_types.txt ", ios_base::out | ios_base::trunc); nëse (!fout.is_open()) // nëse skedari nuk u hap ( cout<< "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение return 1; // выполнить выход из программы } fout << " data type " << "byte" << " " << " max value "<< endl // kokat e kolonave <<"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; }

Është e pamundur të mos vërehet se ndryshimet në program janë minimale, dhe gjithçka falë faktit se hyrje/dalja standarde dhe hyrja/dalja e skedarit përdoren saktësisht në të njëjtën mënyrë. Në fund të programit, nërreshti 45Ne e mbyllëm skedarin në mënyrë eksplicite, megjithëse kjo nuk është e nevojshme, por konsiderohet praktikë e mirë programimi. Vlen të përmendet se të gjitha funksionet dhe manipuluesit e përdorur për të formatuar hyrjen/daljet standarde janë gjithashtu të rëndësishme për hyrjen/daljen e skedarit. Prandaj, nuk ka pasur gabime gjatë deklaratës cout u zëvendësua nga një objekt përleshje.

Artikujt më të mirë mbi këtë temë