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

Hapja e një skedari. Hyrja nga skedari dhe dalje në skedar

Puna me skedarë teksti në C++.

Ekzistojnë dy lloje kryesore të skedarëve: tekst dhe binar. Skedarët lejojnë përdoruesin të lexojë sasi të mëdha të dhënash drejtpërdrejt nga disku pa pasur nevojë t'i futë ato nga tastiera.

    Teksti thirren skedarët që përbëhen nga ndonjë karakter. Ato janë të organizuara në rreshta, secila përfundon me një karakter fundor. Fundi i vetë skedarit tregohet me simbolin "fundi i skedarit". Kur shkruani informacion në një skedar teksti, i cili mund të shikohet duke përdorur çdo redaktues teksti, të gjitha të dhënat konvertohen në një lloj karakteri dhe ruhen në formën e karaktereve.

    binare Në skedarë, informacioni lexohet dhe shkruhet në formën e blloqeve të një madhësie të caktuar, në të cilat mund të ruhen të dhëna të çdo lloji dhe strukture.

Për të punuar me skedarë, të veçantë llojet e të dhënave, thirri përrenj. Rrjedha ifstream përdoret për të punuar me skedarë në modalitetin e leximit dhe të rrjedhës në modalitetin e regjistrimit. Për të punuar me skedarë në modalitetin e shkrimit dhe të leximit, përdoret një transmetim fstream.

Në programet C++, kur punoni me skedarë teksti, duhet të përfshini bibliotekat iostream dhe fstream.

Në mënyrë që shkruani të dhënat në një skedar teksti, ju nevojiten:

    përshkruani një variabël të llojit të rrjedhës.

    nxirrni informacionin në një skedar.

    sigurohuni që ta mbyllni skedarin.

Për duke lexuar të dhëna nga një skedar teksti, ju nevojiten:

    përshkruani një variabël të tipit ifstream.

    hapni një skedar duke përdorur funksionin e hapur.

    mbyll skedarin.

Regjistro informacion në një skedar teksti

    Siç u përmend më herët, për të filluar punën me një skedar teksti, duhet të përcaktoni një variabël të llojit të rrjedhës. Për shembull, si kjo:

    Një variabël F do të krijohet për të shkruar informacion në skedar.

    Në fazën tjetër, skedari duhet të hapet për shkrim. Në përgjithësi, operatori i hapjes së rrjedhës do të duket kështu:

F.open ("skedar", modaliteti);

Këtu F është një ndryshore e përshkruar si rrjedhë,

skedar - emri i plotë i skedarit në disk,

modaliteti - mënyra e punës me skedarin që hapet.

Ju lutemi vini re se kur specifikoni emrin e plotë të skedarit, duhet të përdorni një prerje të dyfishtë. Për shembull, emri i plotë i skedarit noobs.txt, i vendosur në dosjen e lojës në diskun D:, do të duhet të shkruhet kështu:

D: \\ lojë \\ noobs.txt.

Skedari mund të hapet në një nga mënyrat e mëposhtme:

ios::in - hapni skedarin në modalitetin e leximit të të dhënave, kjo mënyrë është mënyra e paracaktuar për ifstreams;

ios::out - hapni një skedar në modalitetin e shkrimit të të dhënave (në këtë rast, informacioni për skedarin ekzistues shkatërrohet), ky modalitet është mënyra e paracaktuar për ofstreams;

ios::app - hapni skedarin në mënyrën e shkrimit të të dhënave deri në fund të skedarit;

ios::ate - lëvizni në fund të një skedari tashmë të hapur;

ios::trunc - pastroni skedarin, kjo ndodh edhe në modalitetin ios::out;

ios::nocreate - mos hapni një skedar nëse nuk ekziston;

ios::noreplace - mos hapni një skedar ekzistues.

Parametri i modalitetit mund të mungojë, në këtë rast skedari hapet në modalitetin e paracaktuar për këtë transmetim.

Pas hapjes me sukses të skedarit (në çdo modalitet), ndryshorja F do të ruajë true, përndryshe false. Kjo do t'ju lejojë të kontrolloni korrektësinë e operacionit të hapjes së skedarit.

Mund të hapni një skedar (le të marrim skedarin D:\\game\\noobs.txt si shembull) në modalitetin e regjistrimit në një nga mënyrat e mëposhtme:

// së pari mënyrë

i rrjedhës F;

F.open("D:\\loja\\noobs.txt", ios::out);

//metoda e dytë, modaliteti ios::out është modaliteti i paracaktuar

// Për rrjedhintë rrjedhës

i rrjedhës F;

//metoda e tretë kombinon përshkrimin e ndryshores dhe llojin e rrjedhës

//dhe hapja e skedarit në një deklaratë

ofstream F("D:\\game\\noobs.txt", ios::out);

Pas hapjes së skedarit në modalitetin e shkrimit, do të krijohet një skedar bosh në të cilin mund të shkruani informacion.

Nëse dëshironi të hapni një skedar ekzistues në modalitetin e shkrimit të parë, duhet të përdorni ios::app si modalitet.

Pas hapjes së një skedari në modalitetin e regjistrimit, mund t'i shkruani në të njëjtën mënyrë si në ekran, vetëm në vend të pajisjes standarde të daljescoutduhet të specifikoni emrin e skedarit të hapur.

Për shembull, për të shkruar variablin a në transmetimin F, deklarata e daljes do të duket si kjo:

Për daljen sekuenciale në rrjedhën G të variablave b, c, d, operatori i daljes do të bëhet si ky:

G<

Mbyllja e një transmetimi bëhet duke përdorur operatorin:

SHEMBULL:

Krijoni një skedar teksti D:\\game\\noobs.txt dhe shkruani n numra realë në të.

#include "stdafx.h"

#përfshi

#përfshi

#përfshi

duke përdorur hapësirën e emrave std;

int main()

setlocale (LC_ALL, "RUS");

int i, n;

dyfishi a;

//përshkruan një rrymë për shkrimin e të dhënave në një skedar

të rrjedhës f;

//hap skedarin në modalitetin e shkrimit,

//modalitetiios:: jashtëinstaluar si parazgjedhje

f.open("D:\\loja\\noobs.txt", ios::out);

//shkruani numrin e numrave realë

cout<<" n="; cin>> n;

//loop për futjen e numrave realë

//dhe shkruajini ato në një skedar

për (i=0; i

cout<<"a=";

//fut një numër

cin>>a;

f<

//mbyllja e rrymës

f.close();

system ("pauzë");

kthimi 0;

_______________________________________________________________

Për të lexuar informacion nga një skedar teksti, duhet të përshkruani një variabël si p.sh ifstream. Pas kësaj, duhet të hapni skedarin për lexim duke përdorur operatorin hapur. Nëse ndryshorja quhet F, atëherë dy deklaratat e para do të jenë si kjo:

F.open("D:\\loja\\noobs.txt", ios::in);

Pas hapjes së një skedari në modalitetin e leximit, mund të lexoni informacion prej tij në të njëjtën mënyrë si nga tastiera, vetëm në vend tëcinspecifikoni emrin e rrymës nga e cila do të lexohen të dhënat.

Për shembull, për të lexuar nga rrjedha F në ndryshoren a, deklarata hyrëse do të duket si kjo:

Dy numra në një redaktues teksti konsiderohen të ndarë nëse ka të paktën një nga karakteret midis tyre: hapësirë, skedë, fund rreshti. Është mirë nëse programuesi e di paraprakisht sa dhe çfarë vlerash duhet të ruajë në skedarin e tekstit. Sidoqoftë, shpesh lloji i vlerave të ruajtura në skedar dihet thjesht, por numri i tyre mund të ndryshojë. Për të zgjidhur këtë problem, duhet të lexoni vlerat nga skedari një nga një dhe përpara çdo leximi, kontrolloni nëse është arritur fundi i skedarit. Ekziston një funksion për këtë F. eof().

Këtu F është emri i thread-it, funksioni kthen një vlerë Boolean: true ose false, në varësi të faktit nëse është arritur fundi i skedarit. Prandaj, një lak për të lexuar përmbajtjen e të gjithë skedarit mund të shkruhet si kjo:

//organizo për leximin e vlerave nga një skedar, ekzekutim

//ciku do të prishet kur të arrijmë në fund të skedarit,

//në këtë rast F.eof() do të kthehet true

ndërsa (!F.eof())

SHEMBULL:

Skedari i tekstit D:\\game\\noobs.txt ruan numrat realë, i shfaq në ekran dhe llogarit numrin e tyre.

#include "stdafx.h"

#përfshi

#përfshi

#përfshi

#përfshi

duke përdorur hapësirën e emrave std;

int main()

setlocale (LC_ALL, "RUS");

int n=0;

noton a;

fstream F;

//hap skedarin në modalitetin e leximit

F.open("D:\\loja\\noobs.txt");

//nëse skedari është hapur saktë, atëherë

//loop për leximin e vlerave nga një skedar; ekzekutimi i lakut do të ndërpritet,

//kur të arrijmë në fund të skedarit, në këtë rast F.eof() do të kthehet true.

ndërsa (!F.eof())

//leximi i vlerës së radhës nga rrjedha F në ndryshoren a

F>>a;

//Nxjerr vlerën e ndryshores a në ekran

cout<

//rrit numrin e numrave të lexuar

//mbyllja e rrymës

F.close();

//fut në ekran numrin e numrave të lexuar

cout<<"n="<

//nëse hapja e skedarit ishte e pasaktë, atëherë dalja

//mesazhe për mungesën e një skedari të tillë

tjetër cout<<" Файл не существует"<

system ("pauzë");

kthimi 0;

C++. Përpunimi i skedarit binar

Kur shkruani informacion në një skedar binar, karakteret dhe numrat shkruhen si një sekuencë bajtash.

Në mënyrë që shkruani të dhënat në një skedar binar, ju nevojiten:

    përshkruani një variabël skedari të tipit FAIL * duke përdorur operatorin FILE *filename;. Këtu emri i skedarit është emri i ndryshores ku do të ruhet treguesi i skedarit.

    shkruani informacion në një skedar duke përdorur funksionin fwrite

Në mënyrë që numëroj b të dhëna nga një skedar binar, ju nevojiten:

    përshkruani një variabël të tipit FILE *

    hapni një skedar duke përdorur funksionin fopen

    mbyllni një skedar duke përdorur funksionin fclose

Funksionet bazë të nevojshme për të punuar me skedarë binare.

Për zbulimet Skedari është menduar për funksionin fopen.

FILE *fopen (konst *emri i skedarit, konst char *modaliteti)

Këtu emri i skedarit është një varg që ruan emrin e plotë të skedarit që hapet, mod është një varg që përcakton mënyrën e punës me skedarin; vlerat e mëposhtme janë të mundshme:

"rb" - hapni skedarin binar në modalitetin e leximit;

"wb" - krijoni një skedar binar për regjistrim; nëse ekziston, përmbajtja e tij pastrohet;

"ab" - krijoni ose hapni një skedar binar për ta shtuar në fund të skedarit;

"rb+" - hapni një skedar binar ekzistues në modalitetin lexim-shkrim;

"wb+" - hapni skedarin binar në modalitetin e leximit-shkrimit, skedari ekzistues pastrohet;

"ab+" - hapet ose krijohet një skedar binar për të korrigjuar informacionin ekzistues dhe për të shtuar informacione të reja në fund të skedarit.

Funksioni kthen NULL në variablin e skedarit f nëse skedari hapet pa sukses. Pas hapjes së një skedari, është i disponueshëm bajt i 0-të i tij, treguesi i skedarit është 0, vlera e të cilit, kur lexohet ose shkruhet, zhvendoset nga numri i bajteve të lexuara (të shkruara). Vlera aktuale e treguesit të skedarit është numri i bajtit nga i cili do të ndodhë operacioni i leximit ose i shkrimit.

Për mbyllja skedari është menduar për funksionin fclose

int fclose(FILE *emri i skedarit);

Kthen 0 nëse skedari është mbyllur me sukses, NULL ndryshe.

Funksioni i heqjes është për heqjen dosjet.

int remove(const char *filename);

Ky funksion fshin një skedar të quajtur filenema nga disku. Skedari që do të fshihet duhet të mbyllet. Funksioni kthen një vlerë jo zero nëse skedari nuk mund të fshihet.

Për riemërimi skedarët, funksioni i riemërtimit synohet:

int riemërto(const char *emri i vjetër i skedarit, const char *newfilename);

Parametri i parë është emri i vjetër i skedarit, i dyti është ai i ri. Kthen 0 nëse programi përfundon me sukses.

Leximi nga një skedar binar bëhet duke përdorur funksionin fread:

fread(void *ptr, madhësia, n, FILE *emri i skedarit);

Funksioni fread lexon n elementë të madhësisë nga emri i skedarit në një grup ptr. Funksioni kthen numrin e elementeve të lexuara. Pas leximit nga një skedar, treguesi i tij zhvendoset me bajt n*madhësi.

Regjistro në një skedar binar bëhet duke përdorur funksionin fwrite:

fwrite(const void *ptr, madhësia, n, FILE *emri i skedarit);

Funksioni fwrite shkruan në emrin e skedarit nga një grup ptr prej n elementësh të madhësisë. Funksioni kthen numrin e elementeve të shkruar. Pas shkrimit të informacionit në skedar, treguesi zhvendoset me bajt me madhësi n*.

Për kontrolli i fundit i skedarit ekziston një funksion feof:

int feof(FILE *emri i skedarit);

Ai kthen një vlerë jo zero nëse arrihet fundi i skedarit.

SHEMBULL:

Krijoni një skedar binar D:\\game\\noobs.dat dhe shkruani n numër të plotë dhe n numra realë në të.

#include "stdafx.h"

#përfshi

duke përdorur hapësirën e emrave std;

int main()

setlocale (LC_ALL, "RUS");

int n, i;

dyfishi a;

//krijoni një skedar binar në modalitetin e shkrimit

f=fopen("D:\\loja\\noobs.dat", "wb");

// hyrje numratn

cout<<"n="; cin>>n;

fwrite(&n, sizeof(int), 1, f);

//loop për të futur n numra realë

për (i=0; i

//fut numrin real të radhës

cout<<"a=";

cin>>a;

//shkrimi i një numri real në një skedar binar

fwrite(&a, sizeof(double), 1, f);

// mbyll dosje

fclose(f);

system ("pauzë");

kthimi 0;

SHEMBULL:

Shfaqni përmbajtjen e skedarit binar D:\\game\\noobs.dat të krijuar në detyrën e mëparshme

#include "stdafx.h"

#përfshi

duke përdorur hapësirën e emrave std;

int main()

setlocale (LC_ALL, "RUS");

int n, i;

dyfish *a;

FILE *f; //përshkruaj variablin e skedarit

//hap skedarin binar ekzistues në modalitetin e leximit

//lexoni një numër të plotë nga skedari në variablin n

//dalja n në ekran

cout<<"n="<

//ndarja e memories për një grup prej n numrash

a=dopio i ri[n];

//lexo n numra realë nga skedari në grup a

//Dalja e grupit në ekran

për (i=0; i

cout<

cout<

// mbyll dosje

fclose(f);

system ("pauzë");

kthimi 0;

Skedar binar- struktura sekuenciale e të dhënave, pas hapjes së një skedari, biti i parë i ruajtur në të është i disponueshëm. Ju mund të shkruani ose lexoni të dhëna nga një skedar në mënyrë sekuenciale. Le të themi se duhet të numëroni numrin e pesëmbëdhjetë, dhe më pas të parin. Duke përdorur aksesin sekuencial kjo mund të bëhet në mënyrën e mëposhtme:

int n, i;

dyfishi a;

FILE *f;

f=fopen("D:\\loja\\noobs.dat", "rb");

për (i=0; i<15; i++)

fclose(f);

f=fopen("D:\\loja\\noobs.dat", "rb");

fread(&a, madhësia e (dyfishtë), 1, f);

fclose(f);

Siç mund ta shihni, leximi i numrave nga një skedar dhe më pas hapja e skedarit përsëri nuk është mënyra më e përshtatshme. Do të jetë shumë më i përshtatshëm për të përdorur funksionin fseek për të zhvendosur treguesin e skedarit në një bajt të caktuar.

int fseek(FILE *emri i skedarit, zhvendosja e gjatë int, origjina int);

Funksioni vendos treguesin F të pozicionit aktual të skedarit në përputhje me vlerat e origjinës dhe të zhvendosjes. Parametri i kompensimit është i barabartë me numrin e bajteve me të cilat treguesi i skedarit do të kompensohet në lidhje me origjinën e specifikuar nga parametri i origjinës. Vlera për parametrin e origjinës duhet të jetë një nga vlerat e mëposhtme të kompensimit të përcaktuara në kokën stdio.h:

SEEK_SET - nga fillimi i skedarit;

SEEK_CUR - nga pozicioni aktual;

SEEK_END - nga fundi i skedarit.

Funksioni kthen një vlerë zero nëse operacioni ishte i suksesshëm, një vlerë jo zero nëse kompensimi dështoi.

Funksioni fseek në të vërtetë zbaton qasje të drejtpërdrejtë në çdo vlerë në një skedar. Ju vetëm duhet të dini vendndodhjen (numrin e bajtit) të vlerës në skedar. Le të shohim përdorimin e aksesit të drejtpërdrejtë në skedarët binare duke përdorur problemin e mëposhtëm si shembull.

SHEMBULL

Në skedarin binar D:\\game\\noobs.dat të krijuar më parë, ndërroni numrat realë më të mëdhenj dhe më të vegjël.

Algoritmi për zgjidhjen e problemit përbëhet nga fazat e mëposhtme:

    leximi i realeve nga një skedar në grup a.

    kërkoni në grupin a për vlerat maksimale (max) dhe minimale (min) dhe numrat e tyre (imax, imin).

    zhvendosja e treguesit të skedarit në vlerën maksimale dhe shkrimi min.

    duke lëvizur treguesin e skedarit në vlerën minimale dhe duke shkruar max.

Më poshtë është teksti i programit për zgjidhjen e problemit me komente.

#include "stdafx.h"

#përfshi

duke përdorur hapësirën e emrave std;

int main()

setlocale (LC_ALL, "RUS");

int n, i, imax, imin;

dyfish *a, max, min;

FILE *f;

//hap një skedar në modalitetin lexim-shkrim

f=fopen("D:\\loja\\noobs.dat", "rb+");

//lexo numrin nga skedari në variablin n

//numrat realë në skedar

fread(&n, sizeof(int), 1, f);

cout<<"n="<

//alokoni memorien për ruajtjen e numrave realë,

//i cili do të ruhet në grup a

a=dopio i ri[n];

//lexo nga skedari në grup dhe numra realë

fread(a, madhësia e (dyfishtë), n, f);

//kërkimi për elementet maksimale dhe minimale

//në grupin a dhe indekset e tyre

për (imax=imin=0, max=min=a, i=1; i

nëse (a[i]> max)

max=a[i];

nëse (a[i]

min=a[i];

// duke lëvizur tregues te maksimale element

fseek(f, sizeof(int)+imax*sizeof(double), SEEK_SET);

//shkruaj min në vend të elementit maksimal të skedarit

fwrite(&min, madhësia (dyfish), 1, f);

// duke lëvizur tregues te minimale element

fseek(f, sizeof(int)+imin*sizeof(double), SEEK_SET);

//record max në vend të elementit minimal të skedarit

fwrite(&max, sizeof(double), 1, f);

//mbyllja e skedarit

fclose(f);

//lirimi i memories

fshij [ ]a;

system ("pauzë");

Skedarët e tekstit

Le të shohim punën me një skedar teksti në C duke përdorur një shembull. Krijo një skedar teksti në diskun C me emrin TextFile.txt. Shkruani rreshtat e mëposhtëm në këtë skedar:

Vargu_1 123 Vargu_11, 456
Vargu_2
Vargu_3

Ruani skedarin.

Dhe ky është kodi për një program C që hap skedarin tonë dhe lexon rreshta prej tij:

/* *Autor: @autor Subbotin B.P..h> #include #define LEN 50 int main(void) ( puts ("Operacionet e skedarit të tekstit"); char cArray; FILE *pTextFile = fopen ("C:\\TextFile.txt", "r"); if(pTextFile == NULL) ( puts("Problems"); kthe EXIT_FAILURE; ) while(fgets(cArray, LEN, pTextFile) != NULL) ( printf("%s", cArray); ) fclose(pTextFile); kthe EXIT_SUCCESS; )

Për të hapur një skedar teksti në C, përdorni funksionin fopen:

FILE *pTextFile = fopen("C:\\TextFile.txt", "r");

Argumenti i parë për funksionin fopen tregon një skedar, dhe i dyti thotë se skedari është i hapur për t'u lexuar prej tij.

Ne lexojmë rreshtat duke përdorur funksionin fgets:

fgets (cArray, LEN, pTextFile);

Argumenti i parë i funksionit fgets tregon një grup karakteresh në të cilin do të ruhen vargjet e marra, argumenti i dytë është numri maksimal i karaktereve për t'u lexuar dhe i treti është skedari ynë.

Pas përfundimit të punës me skedarin, duhet ta mbyllni atë:

fclose(pTextFile);

Ne marrim:

Shkronjat ruse shfaqen gjithashtu në rreshta.

Nga rruga, unë e bëra këtë program në Eclipse. Mund të shihni se si të punoni me C/C++ në Eclipse.

Pra, ne hapëm dhe lexuam të dhënat nga një skedar teksti.

Tani do të mësojmë se si të krijojmë në mënyrë programore një skedar teksti dhe të shkruajmë të dhëna në të.

/* Autori: @autor Subbotin B.P..h> #include int main(void) ( FILE *pTextFile = fopen("C:\\TextFileW.txt", "w"); char *cString = "Ky është një varg"; char cNewLine = "\n"; int nVal = 123 ; if(pTextFile == NULL) ( vendos ("Problemet"); kthe EXIT_FAILURE; ) fprintf(pTextFile, "%s%c", cString, cNewLine); fprintf(pTextFile, "%d", nVal); kthe EXIT_SUCCESS ;)

Krijoni një skedar teksti për të shkruar të dhëna në:

FILE *pTextFile = fopen("C:\\TextFileW.txt", "w");

nëse skedari ekziston tashmë, ai do të hapet dhe të gjitha të dhënat prej tij do të fshihen.

Vargu C cString dhe numri nVal shkruhen nga programi në një skedar teksti. cNewLine është thjesht një linjë e re.

Ne shkruajmë të dhëna në një skedar teksti duke përdorur funksionin fprintf:

fprintf(pTextFile, "%s%c", cString, cNewLine);

argumenti i parë këtu është skedari ynë, i dyti është vargu i formatit, i treti ose më shumë është numri i argumenteve të kërkuara për këtë format.

Për lehtësinë e aksesit, informacioni në pajisjet e ruajtjes ruhet në formën e skedarëve.

Një skedar është një zonë e emërtuar e memories së jashtme e caktuar për ruajtjen e një grupi të dhënash. Të dhënat që përmbajnë skedarët janë të një natyre shumë të larmishme: programe në gjuhën algoritmike ose të makinës; të dhënat fillestare për funksionimin e programit ose rezultatet e ekzekutimit të programit; tekste të lira; imazhe grafike etj.

Drejtori (dosje, drejtori) - një koleksion i emërtuar i bajteve në një medium ruajtjeje që përmban emrat e nëndirektorive dhe skedarëve, të përdorur në sistemin e skedarëve për të thjeshtuar organizimin e skedarëve.

Sistemi i skedarëve quhet pjesa funksionale e sistemit operativ që kryen operacione në skedarë. Shembuj të sistemeve të skedarëve janë FAT (FAT - Tabela e ndarjes së skedarëve), NTFS, UDF (përdoret në CD).

Ekzistojnë tre versione kryesore të FAT: FAT12, FAT16 dhe FAT32. Ato ndryshojnë në thellësinë e bitit të regjistrimeve në strukturën e diskut, d.m.th. numri i biteve të alokuara për të ruajtur numrin e grupit. FAT12 përdoret kryesisht për disqe (deri në 4 KB), FAT16 - për disqe me kapacitet të vogël, FAT32 - për disqe FLASH me kapacitet të lartë (deri në 32 GB).

Le të shohim strukturën e sistemit të skedarëve duke përdorur FAT32 si shembull.

Struktura e skedarit FAT32

Pajisjet e memories së jashtme në sistemin FAT32 kanë adresim blloku dhe jo adresim bajt. Informacioni shkruhet në një pajisje memorie të jashtme në blloqe ose sektorë.

Një sektor është njësia minimale e adresueshme e ruajtjes së informacionit në pajisjet e ruajtjes së jashtme. Në mënyrë tipike, madhësia e sektorit fiksohet në 512 bajt. Për të rritur hapësirën e adresave të pajisjeve të memories së jashtme, sektorët kombinohen në grupe të quajtura grupe.

Një grup është një bashkim i disa sektorëve, i cili mund të konsiderohet si një njësi e pavarur me veti të caktuara. Vetia kryesore e një grupi është madhësia e tij, e matur në numrin e sektorëve ose numrin e bajteve.

Sistemi i skedarëve FAT32 ka strukturën e mëposhtme.

Grupet e përdorura për shkrimin e skedarëve numërohen duke filluar nga 2. Si rregull, grupi nr. 2 përdoret nga direktoria rrënjësore, dhe duke filluar nga grupi nr. 3, grumbullimi i të dhënave ruhet. Sektorët e përdorur për të ruajtur informacionin mbi direktorinë rrënjë nuk janë të grupuar.
Madhësia minimale e skedarit të kërkuar në disk korrespondon me 1 grup.

Sektori i nisjes fillon me informacionin e mëposhtëm:

  • EB 58 90 – kërcim dhe nënshkrim i pakushtëzuar;
  • 4D 53 44 4F 53 35 2E 30 MSDOS5.0;
  • 00 02 – numri i bajteve në sektor (zakonisht 512);
  • 1 bajt – numri i sektorëve në grup;
  • 2 bajt – numri i sektorëve rezervë.

Përveç kësaj, sektori i nisjes përmban informacionin e mëposhtëm të rëndësishëm:

  • 0x10 (1 bajt) – numri i tabelave FAT (zakonisht 2);
  • 0x20 (4 bytes) - numri i sektorëve në disk;
  • 0x2С (4 bytes) – numri i grupit të direktoriumit rrënjë;
  • 0x47 (11 bytes) – etiketa e vëllimit;
  • 0x1FE (2 bytes) – nënshkrimi i sektorit të nisjes (55 AA).

Sektori i informacionit të sistemit të skedarëve përmban:

  • 0x00 (4 bytes) – nënshkrim (52 ​​52 61 41);
  • 0x1E4 (4 bytes) – nënshkrim (72 72 41 61);
  • 0x1E8 (4 bytes) – numri i grupimeve të lira, -1 nëse nuk dihet;
  • 0x1EC (4 bytes) – numri i grupit të fundit të regjistruar;
  • 0x1FE (2 bytes) – nënshkrimi (55 AA).

Tabela FAT përmban informacione për gjendjen e çdo grupi në disk. 2 bajtët e poshtëm të tabelës FAT ruajnë F8 FF FF 0F FF FF FF FF (që korrespondon me gjendjen e grupimeve 0 dhe 1, të cilat mungojnë fizikisht). Më pas, gjendja e çdo grupi përmban numrin e grupit në të cilin skedari aktual vazhdon ose informacionin e mëposhtëm:

  • 00 00 00 00 – grupi është falas;
  • FF FF FF 0F – fundi i skedarit aktual.
  • 8 bajt – emri i skedarit;
  • 3 bajt – zgjerimi i skedarit;

Drejtoria rrënjësore përmban një grup të dhënash informacioni 32-bit për çdo skedar, që përmban informacionin e mëposhtëm:

Kur punoni me emra të gjatë të skedarëve (përfshirë emrat rusë), emri i skedarit kodohet duke përdorur sistemin e kodimit UTF-16. Në këtë rast, 2 bajt ndahen për kodimin e çdo karakteri. Në këtë rast, emri i skedarit shkruhet në strukturën e mëposhtme:

  • 1 bajt sekuence;
  • 10 bajt përmbajnë 5 karakteret e poshtme të emrit të skedarit;
  • atribut 1 bajt;
  • 1 bajt i rezervuar;
  • 1 bajt – shuma e kontrollit të emrit të DOS;
  • 12 bajt përmbajnë 3 karakteret e poshtme të emrit të skedarit;
  • 2 bajt – numri i grupit të parë;
  • personazhet e mbetura të emrit të gjatë.

Puna me skedarë në gjuhën C

Për programuesin, një skedar i hapur përfaqësohet si një sekuencë e të dhënave që lexohen ose shkruhen. Kur hapet një skedar, ai lidhet me Transmetimi I/O. Informacioni dalës shkruhet në rrjedhë, informacioni hyrës lexohet nga transmetimi.

Kur një transmetim hapet për I/O, ai shoqërohet me një strukturë standarde FILE, e cila përcaktohet në stdio.h. Struktura FILE përmban informacionin e nevojshëm për skedarin.

Hapja e një skedari bëhet duke përdorur funksionin fopen(), i cili kthen një tregues në një strukturë FILE që mund të përdoret për operacionet e mëvonshme në skedar.

FILE *fopen(emri, lloji);


emri – emri i skedarit që do të hapet (përfshirë rrugën),
lloji është një tregues për një varg karakteresh që përcaktojnë se si aksesohet skedari:
  • "r" - hapni skedarin për lexim (skedari duhet të ekzistojë);
  • "w" - hapni një skedar bosh për shkrim; nëse skedari ekziston, përmbajtja e tij humbet;
  • "a" - hapni skedarin për shkrim deri në fund (për shtim); skedari krijohet nëse nuk ekziston;
  • "r+" - hapni skedarin për lexim dhe shkrim (skedari duhet të ekzistojë);
  • "w+" - hapni një skedar bosh për lexim dhe shkrim; nëse skedari ekziston, përmbajtja e tij humbet;
  • "a+" - hapni skedarin për lexim dhe shtim; nëse skedari nuk ekziston, atëherë ai krijohet.

Vlera e kthyer është një tregues për rrjedhën e hapur. Nëse haset një gabim, kthehet NULL.

Funksioni fclose() mbyll transmetimin ose transmetimet e lidhura me skedarët e hapur duke përdorur funksionin fopen(). Rrjedha që do të mbyllet përcaktohet nga argumenti i funksionit fclose().

Vlera e kthimit: vlera 0 nëse transmetimi u mbyll me sukses; EOF konstante nëse ka ndodhur një gabim.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#përfshi
int main() (
FILE *fp;
emri char = "my.txt" ;
nëse ((fp = fopen (emri, "r" )) == NULL)
{
printf( "Dështoi në hapjen e skedarit");
getchar ();
kthimi 0;
}
// arriti të hapte skedarin
... // veprimet e nevojshme mbi të dhënat
fclose(fp);
getchar ();
kthimi 0;
}

Leximi i një karakteri nga një skedar:

char fgetc(rrymë);


Argumenti i funksionit është një tregues drejt një rryme të tipit FILE. Funksioni kthen kodin e karakterit të lexuar. Nëse arrihet fundi i skedarit ose ndodh një gabim, EOF konstante kthehet.

Shkrimi i një simboli në një skedar:

fputc (char, stream);

Argumentet e funksionit janë një karakter dhe një tregues drejt një rryme të tipit FILE. Funksioni kthen kodin e karakterit të lexuar.

Funksionet fscanf() dhe fprintf() janë të ngjashëm me funksionet scanf() dhe printf(), por punojnë me skedarë të dhënash dhe kanë një tregues skedari si argumentin e tyre të parë.

fscanf(stream, "InputFormat", argumente);

Për programuesin, një skedar i hapur përfaqësohet si një sekuencë e të dhënave që lexohen ose shkruhen. Kur hapet një skedar, ai lidhet me Transmetimi I/O . Informacioni dalës shkruhet në rrjedhë, informacioni hyrës lexohet nga transmetimi.

Kur një transmetim hapet për I/O, ai shoqërohet me një strukturë standarde FILE, e cila përcaktohet në stdio.h. Struktura FILE përmban informacionin e nevojshëm për skedarin.

Hapja e një skedari bëhet duke përdorur funksionin fopen(), i cili kthen një tregues në një strukturë të tipit FILE që mund të përdoret për operacionet e mëvonshme në skedar.

FILE *fopen(emri, lloji);

emri – emri i skedarit që do të hapet (përfshirë rrugën),
lloji - treguesi për një varg karakteresh që përcaktojnë se si aksesohet skedari:

· "r" - hap skedarin për lexim (skedari duhet të ekzistojë);

· "w" - hap një skedar bosh për shkrim; nëse skedari ekziston, përmbajtja e tij humbet;

· "a" - hapni skedarin për shkrim deri në fund (për shtim); skedari krijohet nëse nuk ekziston;

· "r+" - hap skedarin për lexim dhe shkrim (skedari duhet të ekzistojë);

· "w+" - hap një skedar bosh për lexim dhe shkrim; nëse skedari ekziston, përmbajtja e tij humbet;

· "a+" - hap skedarin për lexim dhe shtim; nëse skedari nuk ekziston, ai krijohet.

Vlera e kthyer është një tregues për rrjedhën e hapur. Nëse zbulohet një gabim, NULL kthehet.

Funksioni fclose() mbyll transmetimin ose transmetimet e lidhura me skedarët e hapur duke përdorur funksionin fopen(). Rrjedha që do të mbyllet përcaktohet nga argumenti i funksionit fclose().

Vlera e kthimit: vlera 0 nëse transmetimi u mbyll me sukses; EOF konstante nëse ka ndodhur një gabim.

#përfshi
int main()

emri char = "my.txt";

if(fp = fopen(emri, "r")!=NULL)

// a ishte e mundur hapja e skedarit?
... // veprimet e nevojshme mbi të dhënat

else printf ("Dështoi në hapjen e skedarit");

Leximi i një karakteri nga një skedar:

char fgetc(rrymë);

Argumenti i funksionit është një tregues drejt një rryme të tipit FILE. Funksioni kthen kodin e karakterit të lexuar. Nëse arrihet fundi i skedarit ose ndodh një gabim, EOF konstante kthehet.
Shkrimi i një simboli në një skedar:

fputc (char, stream);

Argumentet e funksionit janë një karakter dhe një tregues drejt një rryme të tipit FILE. Funksioni kthen kodin e karakterit të lexuar.

Funksionet fscanf() dhe fprintf() janë të ngjashëm me funksionet scanf() dhe printf(), por punojnë me skedarët e të dhënave dhe kanë një tregues për skedarin si argumentin e tyre të parë.

fscanf(stream, "Input Format", argumente);
fprintf(stream, "Output Format", argumente);

Funksionet fgets() dhe fputs() janë krijuar për hyrje/dalje të vargut; ato janë analoge me funksionet gets() dhe puts() për të punuar me skedarë.

fgets (Pointer To Line, Numri i Karaktereve, stream);

Karakteret lexohen nga transmetimi derisa të lexohet një karakter i linjës së re "\n", i cili përfshihet në varg, ose derisa transmetimi të përfundojë EOF ose të lexohet numri maksimal i karaktereve. Rezultati vendoset në një tregues të vargut dhe përfundon me karakterin null "\0". Funksioni kthen adresën e vargut.

fputs (Pointer To String, stream);

Kopjon një varg në transmetim nga pozicioni aktual. Karakteri përfundimtar null nuk kopjohet.
Shembull Futni numrin dhe ruajeni në skedarin s1.txt. Lexoni numrin nga skedari s1.txt, rriteni me 3 dhe ruajeni në skedarin s2.txt.

Mekanizmi I/O i zhvilluar nga , nuk përputhet me stilin e pranuar përgjithësisht të programimit të orientuar nga objekti sot, përveç kësaj, ai përdor shumë operacione treguese që konsiderohen potencialisht të pasigurta në mjediset moderne të ekzekutimit të kodit të sigurt. Një alternativë gjatë zhvillimit të aplikacioneve të aplikacioneve është mekanizmi i klasave standarde I/O të ofruara nga standardi i gjuhës C++.

Hapja e skedarëve

Klasat më të përdorura janë ifstream për lexim, ofstream për shkrim dhe fstream për modifikimin e skedarëve.

Të gjitha klasat e filetuara I/O rrjedhin në mënyrë indirekte nga paraardhësi i përbashkët ios, duke trashëguar plotësisht funksionalitetin e tij. Kështu, mënyra e hapjes së skedarit specifikohet nga anëtari i të dhënave të llojit të numërimit open_mode, i cili përcaktohet si më poshtë:

Enum open_mode (app, binary, in, out, trunc, ate);

Më poshtë janë vlerat e mundshme të flamujve dhe qëllimi i tyre.

Për shembull, për të hapur një skedar të quajtur test.txt për të lexuar të dhënat në formë binare, do të shkruani:

skedari ifstream; file.open("test.txt", ios::in | ios::binary);

Operatori logjik OR (|) ju lejon të krijoni një modalitet me çdo kombinim flamujsh. Pra, në mënyrë që kur hapni një skedar me hyrje, të mos mbishkruani aksidentalisht një skedar ekzistues me të njëjtin emër, duhet të përdorni formularin e mëposhtëm:

Skedari jashtë rrjedhës; file.open("test.txt", ios::out | ios::app);

Supozohet se skedari përkatës i kokës është përfshirë në projekt:

#përfshi

Për të kontrolluar nëse skedari është hapur me sukses, mund të përdorni konstruktin

Nëse (!skedari) ( //Gabim në trajtimin e hapjes së skedarit)

Operatorët e përfshirjes dhe nxjerrjes

E anashkaluar në klasat e trajtimit të skedarëve operatori i përfshirjes (<<) записывает данные в файловый поток. Как только вы открыли файл для записи, можно записывать в него текстовую строку целиком:

Skedari<< "Это строка текста";

Ju gjithashtu mund të shkruani një varg teksti në pjesë:

Skedari<< "Это " << "строка " << "текста";

Deklarata endl përfundon hyrjen e linjës me një kthim të transportit:

Skedari<< "Это строка текста" << endl;

Duke përdorur operatorin e përfshirjes, është e lehtë të shkruani vlerat e variablave ose elementëve të grupit në një skedar:

Skedari jashtë rrjedhës ("Temp.txt"); char buff = "Rreth teksti përmban variabla"; int vx = 100; float pi = 3,14159; dosje<< buff << endl << vx << endl << pi << endl;

Si rezultat i ekzekutimit të kodit, formohen tre rreshta të skedarit të tekstit Temp.txt:

Vargu i tekstit përmban variabla 100 3.14159

Vini re se vlerat numerike shkruhen në skedar si vargje teksti dhe jo si vlera binare.

Operatori i marrjes(>>) prodhon efektin e kundërt. Duket se për të nxjerrë karaktere nga skedari Temp.txt i shkruar më herët, do të shkruani kodin si më poshtë:

Skedari Ifstream ("Temp.txt"); char buff; int vx; noton pi; skedar >> buff >> vx >> pi;

Megjithatë, operatori i nxjerrjes do të ndalet në kufirin e parë që has (hapësirë, skedë ose rresht i ri). Kështu, kur analizohet fjalia "Tekst vargu përmban variabla", vetëm fjala "Text" do të shkruhet në grupin buff, hapësira shpërfillet dhe fjala "array" do të bëhet vlera e të gjithë ndryshores vx dhe kodi. ekzekutimi do të "shkojë keq" me shkelje të pashmangshme të strukturës së të dhënave. Më pas, kur diskutojmë klasën ifstream, do të tregojmë se si të organizojmë siç duhet leximin e skedarit nga shembulli i mëparshëm.

klasa ifstream: leximi i skedarëve

Siç sugjeron emri, klasa ifstream është krijuar për të futur një transmetim skedari. Metodat kryesore të klasës janë renditur më poshtë. Shumica e tyre trashëgohen nga klasa istream dhe mbingarkohen për të zgjeruar funksionalitetin prind. Për shembull, funksioni marrë, në varësi të parametrit të thirrjes, mund të lexojë jo vetëm një karakter të vetëm, por edhe një bllok karakteresh.

Tani është e qartë se si shembulli i mëparshëm duhet të modifikohet në mënyrë që përdorimi i operatorit të nxjerrjes së të dhënave të japë rezultatin e pritur:

Skedari Ifstream ("Temp.txt"); char buff; int vx; noton pi; file.getline(buff, sizeof(buff)); skedar >> vx >> pi:

Metoda getline do të lexojë rreshtin e parë të skedarit deri në fund, dhe operatori >> do t'u caktojë vlera variablave.

Shembulli i mëposhtëm tregon shtimin e të dhënave në një skedar teksti dhe më pas leximin e të gjithë skedarit. Një lak while(1) përdoret në vend të while(!file2.eof()) për arsye të diskutuara në .

#përfshi #përfshi duke përdorur hapësirën e emrave std; int main() ( file ofstream; file.open ("test.txt",ios::out|ios::app); if (!file) (cout<< "File error - can"t open to write data!"; cin.sync(); cin.get(); return 1; } for (int i=0; i<10; i++) file << i << endl; file.close(); ifstream file2; file2.open("test.txt", ios::in); if (!file2) { cout << "File error - can"t open to read data!"; cin.sync(); cin.get(); return 2; } int a,k=0; while (1) { file2 >>a; nëse (skedari2.eof()) thyhet; cout<< a << " "; k++; } cout << endl << "K=" << k << endl; file2.close(); cin.sync(); cin.get(); return 0; }

Shembulli i mëposhtëm tregon një lak që lexon rreshta nga skedari test.txt dhe i shfaq ato në tastierë.

#përfshi #përfshi duke përdorur hapësirën e emrave std; int main() ( file ifstream; // krijoni një skedar skedari të objektit të transmetimit.open("test.txt"); // hapni skedarin për lexim nëse (!file) kthen 1; // ktheni në gabimin e hapjes char str; // tampon linja statike // Lexoni dhe shfaqni linjat në një lak deri në eof ndërsa (!file.getline(str, sizeof(str)).eof()) cout<< str << endl; // вывод прочитанной строки на экран cin.sync(); cin.get(); return 0; }

Ky kod në Windows OS varet gjithashtu nga prania e një karakteri të linjës së re në rreshtin e fundit të skedarit; do të ishte më e besueshme ta bëni këtë:

Ndërsa (1) ( if (file.eof()) thyen; file.getline(str, sizeof(str)); cout<< str << endl; }

Thirrjet e qarta në metodat e hapjes dhe mbylljes nuk kërkohen. Në të vërtetë, thirrja e konstruktorit me një argument ju lejon të hapni skedarin menjëherë, në momentin e krijimit të objektit të skedarit të filetuar:

Skedari Ifstream ("test.txt");

Në vend të metodës së mbylljes, mund të përdorni operatorin e fshirjes, i cili automatikisht do të thërrasë destruktorin e objektit të skedarit dhe do të mbyllë skedarin. Kodi i ciklit while siguron kontrolle të duhura në fund të skedarit.

ofstream class: shkrimi i skedarëve

Klasa ofstream është krijuar për të nxjerrë të dhëna nga një rrjedhë skedari. Më poshtë renditen metodat kryesore të kësaj klase.

Operatori i përfshirjes i përshkruar më parë është i përshtatshëm për organizimin e shkrimit në një skedar teksti:

Skedari jashtë rrjedhës ("temp.txt"); nëse (!skedari) kthehet; për (int i=1; i<=3; i++) file << "Строка " << i << endl; file.close();

Skedarët binare

Në parim, të dhënat binare trajtohen si të dhëna teksti. Dallimi është se nëse të dhënat binare shkruhen në një strukturë logjike specifike, atëherë ato duhet të lexohen nga një skedar në një variabël të të njëjtit lloj strukture.

Parametri i parë i metodave të shkrimit dhe leximit (adresa e bllokut shkrim/lexim) duhet të jetë i tipit të treguesit të karakterit char * , kështu që është e nevojshme të kryhet një konvertim i qartë i llojit të adresës së strukturës void *. Parametri i dytë specifikon që blloqet binare të skedarit kanë një madhësi konstante bajt, pavarësisht nga gjatësia aktuale e regjistrimit. Aplikacioni i mëposhtëm ofron një shembull të krijimit dhe shfaqjes së të dhënave në një fletore të thjeshtë. Regjistrimet e skedarëve më pas lexohen në mënyrë sekuenciale dhe shfaqen në tastierë.

#përfshi #përfshi #përfshi duke përdorur hapësirën e emrave std; struct Shënime ( // struktura e të dhënave të fletores char Emri; // emri i plotë char Telefoni; // telefon int Mosha; // mosha ); int main() ( setlocale(LC_ALL, "Russian"); Shënime Shënim1= ("Ioann Vasilyevich i tmerrshëm", "i pa instaluar", 60); Shënime Shënim2= ("Godunov Boris Fedorovich", "095-111-2233" , 30 ); Shënime Shënim3= ( "Romanov Petr Mikhailovich ", "812-333-2211 ", 20 ); ofile ofile ("Notebook.dat", ios::binary); ofile.write((char*)&Note1, sizeof (Shënime)); // Blloku i parë ofile.write((char*)&Note2, sizeof(Shënime)); // Blloku i 2-të ofile.write((char*)&Note3, sizeof(Notes)); / / Blloku i 3-të ofile.close(); // mbyll skedarin e regjistruar ifstream ifile ("Notebook.dat", ios::binary); Shënime Shënim; // ndryshore e strukturuar char str; // buffer string statik // Lexoni dhe shfaqni rreshtat në një loop deri në eof ndërsa (!ifile.read((char*)&Note, sizeof(Notes)).eof()) ( sprintf(str, "%s\tTelefon: %s\tMosha: %d" , Shënim.Emri, Shënim.Telefon, Shënim.Mosha);cout<< str << endl; } ifile.close(); // закрыть прочитанный файл cin.sync(); cin.get(); return 0; }

Si rezultat i ekzekutimit të këtij kodi, një skedar binar Notebook.dat formohet nga tre blloqe me nga 80 bajt secili (duke supozuar se karakteret janë me një bajt). Natyrisht, ju mund të përdorni metoda të tjera të filetimit dhe të kryeni ndonjë operacion në fushat e një strukture specifike të të dhënave.

Klasa fstream: akses i rastësishëm i skedarëve

Le të supozojmë se kemi 100 shënime në fletoren tonë dhe duam të numërojmë të 50-tën. Sigurisht, ju mund të organizoni një lak dhe të lexoni të gjitha regjistrimet nga i pari në atë të dhënë. Natyrisht, një zgjidhje më e synuar është të vendosni treguesin e pozicionit të skedarit pos drejtpërdrejt në hyrjen 50 dhe të lexoni prej tij:

Ifstream ifile("Notebook.dat", ios::binary); int pos = 49 * sizeof(Shënime); ifile.seekg(pos); // kërkoni për shënimin e shënimit të 50-të; //Shënime – struktura “record” e përshkruar më sipër ifile.read((char*)&Note, sizeof(Notes));

Operacione të tilla kërkimi janë efektive nëse skedari përbëhet nga regjistrime me madhësi të njohur dhe konstante. Për të zëvendësuar përmbajtjen e një regjistrimi arbitrar, duhet të hapni rrjedhën e daljes në modalitetin e modifikimit:

Ofile ofile ("Notebook.dat", ios::binary | ios::ate); int pos = 49 * sizeof(Shënime); ofile seekp(pos); // kërkoni për shënimin e 50-të Shënime Shënim50 = ("Yeltsin Boris Nikolaevich", "095-222-3322", 64); ofile.write((char*)&Shënim, sizeof(Shënime)); // zëvendësim

Nëse nuk e specifikoni flamurin ios::ate (ose ios::app), atëherë kur hapni skedarin binar Notebook.dat, përmbajtja e tij e mëparshme do të fshihet!

Së fundi, është e mundur të hapet një skedar njëkohësisht për lexim/shkrim, duke përdorur metodat e trashëguara nga klasa e transmetimit fstream nga paraardhësit e saj. Meqenëse klasa fstream rrjedh nga istream dhe ostream (prindërit e ifstream dhe ofstream respektivisht), të gjitha metodat e përmendura më parë bëhen të disponueshme në aplikacion.

Shembulli i mëposhtëm tregon rirregullimin e hyrjes së parë dhe të tretë në skedarin Notebook.dat.

#përfshi #përfshi #përfshi duke përdorur hapësirën e emrave std; struct Shënime (Emri char; Telefoni char; mosha int; ); int main() ( setlocale(LC_ALL, "Rusisht"); Shënime Shënim1, Shënim3; // Hap skedarin për lexim/shkrim njëkohësisht skedar fstream("Notebook.dat", ios::binary | ios::in | ios: : jashtë); file.seekg (2 * sizeof(Shënime)); // gjeni dhe lexoni skedarin Note3.read((char*)&Note3, sizeof(Shënime)); file.seekg(0); // gjeni dhe lexoni Skedari Note1.read((char*)&Note1, sizeof(Shënime)); file.seekg(0); // Shënim1<== Note3 file.write((char*)&Note3, sizeof(Notes)); file.seekg(2 * sizeof(Notes)); // Note3 <== Note1 file.write((char*)&Note1, sizeof(Notes)); char str; // Считывать и отображать записи в цикле, пока не eof file.seekg(0); // вернуться к началу файла while (!file.read((char*)&Note1, sizeof(Notes)).eof()) { sprintf(str, "%s\tТел: %s\tВозраст: %d", Note1.Name, Note1.Phone, Note1.Age); cout << str << endl; } file.close(); cin.sync(); cin.get(); return 0; }

Në konstruktorin e objektit të skedarit, duhet të specifikoni flamujt ios::in dhe ios::out, duke lejuar operacione të njëkohshme leximi dhe shkrimi. Si rezultat i ekzekutimit të këtij kodi, hyrja e parë dhe e tretë në skedarin binar Notebook.dat do të shkëmbehen.

Ka shembuj shtesë për këtë temë.

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