Stinët

Shtëpi

Tek mësuesi

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

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:

Në rast të punës me emra të gjatë skedarë (përfshirë emrat rusë), emri i skedarit është i koduar në 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+" - hap 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);

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 e leximit ("r"), modalitetin e shkrimit ("w") ose modalitetin e shtojcës ("a") dhe kthen një tregues. për atë në program. 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" ) while (fscanf (skedar, "%s%u%f" , dyqan[ i].emri , & (dyqan[ i].qty ) , & (dyqan[ i].çmimi ) != EOF) ( printf (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 (vargu i karaktereve, numri i karaktereve për të lexuar, treguesi në skedar)

Për shembull:

#përfshi fgets (str, 50, myfile) \n" 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.

#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 ("

) ;

fclose(file);

) \n" 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. \0 " getc () ose fgetc () \n" Funksioni getc() ose fgetc() (të dyja funksionojnë) ju lejon të merrni karakterin tjetër të vetëm nga një skedar. \0 " getc () ose fgetc () \n" ndërsa ((arr[ i] = fgetc (skedar) ) != EOF) ( nëse (arr[ i] == "

) (arr[i] = "

;

printf("%s

  • , arr) ;
  • 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.

Shkruani fushat e një strukture në çdo rresht të skedarit:

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

, shop[ i].emri, dyqani[ i].sasia, dyqani[ i].çmimi);

i++; \n")

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 ("

, skedar);

)

Shembull i daljes karakter pas karakteri:

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

Leximi nga dhe shkrimi në një skedar binar

  1. 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ë, kjo mund të përdoret gjithashtu për të lexuar dhe shkruar në skedarë teksti. 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.
  2. Kur hapni një skedar për qasje binar, parametri i dytë për fopen() është vargu "rb" ose "wb".
  3. 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.
  4. Funksionet fread() dhe fwrite() marrin si parametra:

adresa e zonës së memories nga ku shkruhen ose lexohen të dhënat,

madhësia e një të dhënë çdo lloji,

#përfshi sasia e të dhënave të lexuara të madhësisë së specifikuar, indeksi i skedarit. \0 " 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. \n" Një shembull i përdorimit të funksioneve fread() dhe fwrite(): \0 " #përfshi

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ë.

Etiketa: Skedarët e tekstit, fopen, fclose, feof, setbuf, setvbuf, flush, fgetc, fprintf, fscanf, fgets, transmetim me buffer, transmetim të pabuferuar.

Puna me skedarë teksti

Puna me një skedar teksti është e ngjashme me punën me tastierën: duke përdorur funksionet e hyrjes së formatuar ne ruajmë të dhënat në një skedar, duke përdorur funksionet e daljes së formatuar ne lexojmë të dhëna nga një skedar. Ka shumë nuanca që do t'i shikojmë më vonë. Operacionet kryesore që duhen bërë janë

  • 1. Hapni skedarin në mënyrë që të mund të aksesohet. Prandaj, mund ta hapni atë për lexim, shkrim, lexim dhe shkrim, rishkrim ose shkrim deri në fund të skedarit, etj. Kur hapni një skedar, mund të ndodhin edhe një sërë gabimesh - skedari mund të mos ekzistojë, mund të jetë lloji i skedarit të gabuar, mund të mos keni leje për të punuar me skedarin, etj. E gjithë kjo duhet të merret parasysh.
  • 2. Puna e drejtpërdrejtë me skedarin - shkrimi dhe lexim. Këtu duhet të kujtojmë gjithashtu se nuk po punojmë me memorie me akses të rastësishëm, por me një rrymë të buferuar, e cila shton specifikat e veta.
  • 3. Mbyllni skedarin. Meqenëse skedari është një burim i jashtëm për programin, nëse nuk është i mbyllur, ai do të vazhdojë të qëndrojë në memorie, ndoshta edhe pasi programi të jetë mbyllur (për shembull, nuk do të jetë e mundur të fshini një skedar të hapur ose të bëni ndryshime, etj). Për më tepër, ndonjëherë është e nevojshme të mos mbyllni, por të "rihapni" një skedar në mënyrë që, për shembull, të ndryshoni mënyrën e hyrjes.

Përveç kësaj, ka një sërë detyrash kur nuk kemi nevojë të aksesojmë përmbajtjen e skedarit: riemërimi, zhvendosja, kopjimi, etj. Fatkeqësisht, standardi C nuk përmban një përshkrim të funksioneve për këto nevoja. Ato, natyrisht, janë të disponueshme për secilin prej zbatimeve të përpiluesit. Leximi i përmbajtjes së një drejtorie (dosje, direktori) është gjithashtu akses në një skedar, sepse vetë dosja është një skedar me metainformacion.

Ndonjëherë është e nevojshme të kryhen disa operacione ndihmëse: lëvizni në vendndodhjen e dëshiruar në skedar, mbani mend gjendjen aktuale, përcaktoni gjatësinë e skedarit, etj.

Për të punuar me një skedar, ju nevojitet një objekt FILE. Ky objekt ruan identifikuesin e rrjedhës së skedarit dhe informacionin e nevojshëm për ta menaxhuar atë, duke përfshirë një tregues në buferin e tij, një tregues të pozicionit të skedarit dhe treguesit e statusit.

Objekti FILE është në vetvete një strukturë, por fushat e tij nuk duhet të aksesohen. Programi portativ duhet ta trajtojë skedarin si një objekt abstrakt që lejon aksesin në rrjedhën e skedarit.

Krijimi dhe shpërndarja e memories për një objekt të tipit FILE kryhet duke përdorur funksionin fopen ose tmpfile (ka të tjerë, por ne do të përqendrohemi vetëm në këto).

Funksioni fopen hap një skedar. Ai merr dy argumente - një varg me adresën e skedarit dhe një varg me mënyrën e hyrjes në skedar. Emri i skedarit mund të jetë absolut ose relativ. fopen kthen një tregues në një objekt FILE që mund të përdoret për të aksesuar më tej skedarin.

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

Për shembull, le të hapim një skedar dhe të shkruajmë Hello World në të

#përfshi #përfshi #përfshi void main() ( //Duke përdorur variablin e skedarit ne do të aksesojmë skedarin FILE *file; //Hap një skedar teksti me skedarin e lejeve të shkrimit = fopen("C:/c/test.txt", "w+t") ; //Shkruani në skedarin fprintf(file, "Përshëndetje, Botë!");

Vetë funksioni fopen shpërndan memorie për objektin, pastrimi kryhet nga funksioni fclose. Është e nevojshme të mbyllet skedari, ai nuk do të mbyllet vetë.

Funksioni fopen mund të hapë një skedar në modalitetin tekst ose binar. Parazgjedhja është teksti. Mënyra e hyrjes mund të jetë si më poshtë

Opsionet e hyrjes në skedar.
Lloji Përshkrimi
r Leximi. Skedari duhet të ekzistojë.
w Shkruani një skedar të ri. Nëse një skedar me të njëjtin emër ekziston tashmë, përmbajtja e tij do të humbet.
a Shkruani deri në fund të skedarit. Operacionet e pozicionimit (fseek, fsetpos, frewind) nuk merren parasysh. Skedari krijohet nëse nuk ekziston.
r+ Leximi dhe përditësimi. Ju mund të lexoni dhe të shkruani. Skedari duhet të ekzistojë.
w+ Regjistrimi dhe përditësimi. Krijohet një skedar i ri. Nëse një skedar me të njëjtin emër ekziston tashmë, përmbajtja e tij do të humbet. Ju mund të shkruani dhe të lexoni.
a+ Përfundoni postimin dhe përditësimin. Operacionet e pozicionimit janë vetëm për lexim dhe injorohen për shkrime. Nëse skedari nuk ekziston, do të krijohet një i ri.

Nëse është e nevojshme të hapni skedarin në modalitetin binar, atëherë shkronja b shtohet në fund të rreshtit, për shembull "rb", "wb", "ab", ose, për modalitetin e përzier, "ab+", " wb+”, “ab+”. Në vend të b, mund të shtoni shkronjën t, atëherë skedari do të hapet në modalitetin e tekstit. Varet nga zbatimi. Në standardin e ri C (2011), shkronja x do të thotë që fopen duhet të dështojë nëse skedari tashmë ekziston. Le të plotësojmë tonën program i vjetër: Le të rihapim dosjen dhe të shqyrtojmë atë që kemi shkruar atje.

#përfshi #përfshi #përfshi void main() ( FILE *file; char buffer; skedar = fopen ("C:/c/test.txt", "w"); fprintf (skedar, "Përshëndetje, Botë!"); fclose (skedar); skedar = fopen("C:/c/test.txt", "r" fgets(buffer, 127, file ("%s", skedar);

Në vend të funksionit fgets, mund të përdorni fscanf, por duhet të mbani mend se ai mund të lexojë rreshtin vetëm deri në hapësirën e parë.
fscanf(skedar, "%127s", buffer);

Gjithashtu, në vend që të hapni dhe mbyllni një skedar, mund të përdorni funksionin freopen, i cili "rihap" skedarin me të drejta të reja aksesi.

#përfshi #përfshi #përfshi void main() ( FILE *file; char buffer; skedar = fopen ("C:/c/test.txt", "w"); fprintf (skedar, "Përshëndetje, Botë!"); freopen ("C:/ c/test.txt", "r", skedar); fgets (buffer, 127, skedar); printf ("%s", buffer); fclose (skedar); getch (); )

Funksionet fprintf dhe fscanf ndryshojnë nga printf dhe scanf vetëm në atë që ata marrin si argument të parë një tregues të FILE-it në të cilin do të nxjerrin ose nga i cili do të lexojnë të dhëna. Vlen të shtohet menjëherë se funksionet printf dhe scanf mund të zëvendësohen lehtësisht nga funksionet fprintf dhe fscanf. Në OS (ne konsiderojmë më të zakonshmet dhe më të përshtatshmet sistemet operative) ka tre prurje standarde: dalje standarde stdout, hyrje standarde stdin dhe dalje standarde e gabimit stderr. Ato hapen automatikisht kur hapet aplikacioni dhe lidhen me tastierën. Shembull

#përfshi #përfshi #përfshi void main() ( int a, b; fprintf(stdout, "Fut dy numra\n"); fscanf(stdin, "%d", &a); fscanf(stdin, "%d", &b); nëse (b == 0) ( fprintf(stderr, "Gabim: pjesëto me zero"); ) else (fprintf(stdout, "%.3f", (float) a / (float) b); ) getch();

Gabim në hapjen e skedarit

Nëse thirrja e funksionit fopen dështon, ajo do të kthehet NULL. Gabimet gjatë punës me skedarë ndodhin mjaft shpesh, kështu që sa herë që hapim një skedar, duhet të kontrollojmë rezultatin e punës

#përfshi #përfshi #përfshi #define ERROR_OPEN_FILE -3 void main() ( FILE *file; char buffer; file = fopen("C:/c/test.txt", "w"); if (file == NULL) ( printf("Gabim në hapje skedar"); getch(); dalje (ERROR_OPEN_FILE); ) fprintf (skedar, "Përshëndetje, Botë!"); freopen ("C:/c/test.txt", "r", skedar); nëse (skedari = = NULL) ( printf("Gabim në hapjen e skedarit"); getch(); dalje (ERROR_OPEN_FILE); ) fgets(buffer, 127, skedari""%s", buffer(skedar); ;)

Problemi lind kur hapen disa skedarë në të njëjtën kohë: nëse njëri prej tyre nuk mund të hapet, atëherë pjesa tjetër duhet të mbyllet gjithashtu.

FILE *inputFile, *outputFile;

i panënshkruar m, n; i panënshkruar i, j; inputFile = hap (INPUT_FILE, VETËM LEXUAR); if (inputFile == NULL) ( printf("Gabim në hapjen e skedarit %s", INPUT_FILE); getch(); exit(3); ) outputFile = fopen(OUTPUT_FILE, WRITE_ONLY); if (outputFile == NULL) ( printf ("Gabim në hapjen e skedarit %s", OUTPUT_FILE); getch(); if (inputFile != NULL) ( fclose(inputFile); ) dalje (4); ) ...

raste të thjeshta

  • ju mund të veproni kokë më kokë, si në pjesën e mëparshme të kodit. Në më shumë
  • raste të vështira
  • përdoren metoda që zëvendësojnë RAII nga C++: mbështjellës, ose veçori të përpiluesit (pastrimi në GCC), etj.
  • Buferimi i të dhënave

Siç u përmend më herët, kur nxjerrim të dhëna, ato fillimisht vendosen në një buffer. Buferi është pastruar

#përfshi #përfshi #përfshi 1) Nëse është plot

2) Nëse rryma është e mbyllur

3) Nëse tregojmë në mënyrë eksplicite se është e nevojshme të pastrohet buffer (ka përjashtime edhe këtu :)).

4) Gjithashtu pastrohet nëse programi përfundoi me sukses. Në të njëjtën kohë, të gjitha dosjet mbyllen. Në rast të një gabimi në kohën e ekzekutimit, kjo mund të mos ndodhë.

i cili merr një FILE tashmë të hapur dhe një tregues në një buffer të ri. Madhësia e tamponit të ri duhet të jetë jo më pak se BUFSIZ (për shembull, në stacionin aktual të punës BUFSIZ është 512 bajt). Nëse kaloni NULL si bufer, transmetimi bëhet i pabuferuar. Ju gjithashtu mund të përdorni funksionin

Int setvbuf(FILE * stream, char * buffer, int mode, size_t size);

e cila pranon një tampon me madhësi arbitrare. modaliteti mund të marrë vlerat e mëposhtme

  • _IOFBF- buffering i plotë. Të dhënat shkruhen në skedar kur është plot. Pas leximit, buferi konsiderohet i plotë kur kërkohet një operacion hyrës dhe buferi është bosh.
  • _IOLBF- buffering linear. Të dhënat shkruhen në skedar kur ai është i plotë ose kur haset një karakter i linjës së re. Pas leximit, buferi mbushet me karakterin e linjës së re kur kërkohet një operacion hyrës dhe buferi është bosh.
  • _IONBF– pa buferim. Në këtë rast, madhësia dhe parametrat e tamponit injorohen.
Nëse është i suksesshëm, funksioni kthen 0.

Shembull: le të vendosim bufferin tonë dhe të shohim se si kryhet leximi nga një skedar. Le të jetë skedari i shkurtër (diçka si Hello, World!), dhe ne e lexojmë atë karakter pas karakter

#përfshi #përfshi #përfshi void main() ( FILE *input = NULL; char c; char buffer = (0); input = fopen("D:/c/text.txt", "rt"); setbuf(hyrje, buffer); ndërsa ( !feof(hyrje)) (c = fgetc(hyrje); printf("%c\n", c); printf("%s\n", buffer); _getch(); ) fclose(hyrje)

Mund të shihet se të dhënat janë tashmë në tampon. Leximi karakter për karakter bëhet nga buferi.

feof

Funksioni int feof(FILE * stream); kthehet true nëse arrihet fundi i skedarit. Ky funksion është i përshtatshëm për t'u përdorur kur duhet të kaloni të gjithë skedarin nga fillimi në fund. Le të ketë një skedar me përmbajtje teksti text.txt. Ne lexojmë skedarin karakter për karakter dhe e shfaqim atë në ekran.

#përfshi #përfshi #përfshi void main() ( FILE *input = NULL; char c; input = fopen ("D:/c/text.txt", "rt"); if (input == NULL) (printf("Gabim në hapjen e skedarit") _getch(0) (!feof(hyrje))

Gjithçka do të ishte mirë, por funksioni feof nuk funksionon si duhet... Kjo për faktin se koncepti "fundi i skedarit" nuk është i përcaktuar. Një gabim që ndodh shpesh kur përdorni feof është se të dhënat e fundit të lexuara printohen dy herë. Kjo për faktin se të dhënat shkruhen në buferin e hyrjes, leximi i fundit ndodh me një gabim dhe funksioni kthen vlerën e vjetër të lexuar.

#përfshi #përfshi #përfshi void main() ( FILE *input = NULL; char c; input = fopen ("D:/c/text.txt", "rt"); if (input == NULL) (printf("Gabim në hapjen e skedarit") _getch(0), ndërsa (!feof(hyrje)) ();

Ky shembull do të dështojë (ka shumë të ngjarë) dhe do të printojë karakterin e fundit të skedarit dy herë.

Zgjidhja është të mos përdorni feof. Për shembull, dyqan sasinë totale regjistron ose përdor faktin që funksionet fscanf etj. zakonisht kthejnë numrin e vlerave të lexuara dhe të përputhura saktë.

#përfshi #përfshi #përfshi void main() ( FILE *input = NULL; char c; input = fopen ("D:/c/text.txt", "rt"); if (input == NULL) (printf("Gabim në hapjen e skedarit") _getch(0);

Shembuj

1. Një skedar përmban dy numra - dimensionet e grupit. Le të mbushim skedarin e dytë me një grup numrash të rastit.

#përfshi #përfshi #përfshi #përfshi //Emrat dhe lejet e skedarëve #define INPUT_FILE "D:/c/input.txt" #define OUTPUT_FILE "D:/c/output.txt" #define READ_ONLY "r" #define WRITE_ONLY "w" //Vlera maksimale për grupin madhësia #define MAX_DIMENSION 100 //Gabim gjatë hapjes së skedarit #define ERROR_OPEN_FILE -3 void main() ( FILE *inputFile, *outputFile; i panënshkruar m, n; i panënshkruar i, j; inputFile = fopen(INPUT_FILE, READ_ON); inputFile == NULL) ( printf("Gabim në hapjen e skedarit %s", INPUT_FILE); getch(); dalje (ERROR_OPEN_FILE); ) outputFile = fopen(OUTPUT_FILE, WRITE_ONLY) (printf("Gabim). hapja e skedarit %s", OUTPUT_FILE); getch(); //Nëse skedari mund të hapet për lexim, atëherë duhet të mbyllet nëse (inputFile != NULL) ( fclose(inputFile); ) del (ERROR_OPEN_FILE); ) fscanf (InputFile, "%ud %ud", &n, nëse (m > MAX_DIMENSION; ) nëse (n > MAX_DIMENSION) (n = MAX_DIMENSION; ) srand(NULL));< n; i++) { for (j = 0; j < m; j++) { fprintf(outputFile, "%8d ", rand()); } fprintf(outputFile, "\n"); } //Закрываем файлы fclose(inputFile); fclose(outputFile); }

2. Përdoruesi kopjon skedarin dhe së pari zgjedh mënyrën e funksionimit: skedari mund të dalë ose në tastierë ose të kopjohet në një skedar të ri.

#përfshi #përfshi #përfshi #define ERROR_FILE_OPEN -3 void main() ( FILE *origjina = NULL; FILE *output = NULL; emri i skedarit; int mode; printf ("Fut emrin e skedarit: "); scanf ("%1023s", emri i skedarit); origjina = fopen (emri i skedarit, "r" (origjina == NULL) (printf ("Gabim në hapjen e skedarit %s", emri i skedarit); dalja (ERROR_FILE_OPEN); ) printf ("hyni modalitetin: "%); d", &mode); nëse (modaliteti == 1) ( printf ("Fut emrin e skedarit: "); scanf ("%1023s", emri i skedarit); dalje = fopen (emri i skedarit, "w"); nëse (dalja = = NULL ) ( printf("Gabim në hapjen e skedarit %s", emri i skedarit); getch(); fclose(origjina); dalje (ERROR_FILE_OPEN); ) ) else ( output = stdout; ) ndërsa (!feof(origjina)) ( fprintf (output , "%c", fgetc(origjina));

3. Përdoruesi fut të dhënat nga tastiera dhe shkruhet në një skedar derisa të shtypet tasti esc. Shikoni programin dhe shikoni. si sillet nëse futni hapësirën e pasme: çfarë del në skedar dhe çfarë del në tastierë.

#përfshi #përfshi #përfshi #define ERROR_FILE_OPEN -3 void main() ( FILE *output = NULL; char c; output = fopen ("D:/c/test_output.txt", "w+t"); if (output == NULL) ( printf ("Gabim në hapjen e skedarit" _getch(ERROR_FILE_OPEN) për (;;) (c == 27) ( break; ) fputc(c); , stdout);

4. Skedari përmban numra të plotë. Gjeni maksimumin prej tyre. Le të përfitojmë nga fakti që funksioni fscanf kthen numrin e objekteve të lexuara dhe të përputhura saktë. Numri 1 duhet të kthehet çdo herë.

#përfshi #përfshi #përfshi #define ERROR_FILE_OPEN -3 void main() ( FILE *input = NULL; int num, maxn, hasRead; input = fopen ("D:/c/input.txt", "r"); nëse (hyrja == NULL) ( printf("Gabim në hapjen e skedarit"); _getch(); dalje (ERROR_FILE_OPEN); nëse (hasRead != 1) (vazhdim; ) nëse (num >

Një zgjidhje tjetër është leximi i numrave derisa të arrijmë në fund të skedarit.

#përfshi #përfshi #përfshi #përfshi #define ERROR_FILE_OPEN -3 void main() ( FILE *input = NULL; int num, maxn, hasRead; input = fopen ("D:/c/input.txt", "r"); nëse (hyrja == NULL) ( printf("Gabim në hapjen e skedarit"); _getch(); dalje (ERROR_FILE_OPEN); ) maxn = INT_MIN ndërsa (!feof(input)) (fscanf(input, "%d", &num); if (num > maxn; ) ( maxn = num; ) ) printf("numri maksimal = %d", maxn);

5. Skedari përmban fjalët: Fjalë ruse, skeda, fjalë angleze, në disa rreshta. Përdoruesi fut një fjalë angleze, është e nevojshme të nxirret ajo ruse.

Skedari i përkthimit duket diçka si kjo

diell dielli
stilolaps laps
laps me stilolaps
dera e derës
dritare windows
karrige karrige
kolltuk

dhe ruhet në kodimin cp866 (OEM 866). Është e rëndësishme: çifti i fundit i fjalëve përfundon gjithashtu me një furnizim rreshti.

Algoritmi është si më poshtë: ne lexojmë një rresht nga një skedar, gjejmë një karakter skedë në rresht, zëvendësojmë karakterin e skedës me një zero, kopjojmë një fjalë ruse nga buferi, kopjojmë një fjalë angleze nga tampon, kontrollojmë për barazi.

#përfshi #përfshi #përfshi #përfshi #define ERROR_FILE_OPEN -3 void main() ( FILE *input = NULL; char buffer; char enWord; char ruWord; char usrWord; indeks i panënshkruar; gjatësia int; int wasFound; input = fopen("D:/c/input.txt ", "r"); if (input == NULL) ( printf ("Gabim në hapjen e skedarit"); _getch (); dalje (ERROR_FILE_OPEN); ) printf ("fut fjalën: "); fgets(usrWord, 127, stdin wasFound = 0 while (!feof(input)) (fgets(buffer, 511, input);gjatësia = strlen(buffer);< length; index++) { if (buffer == "\t") { buffer = "\0"; break; } } strcpy(ruWord, buffer); strcpy(enWord, &buffer); if (!strcmp(enWord, usrWord)) { wasFound = 1; break; } } if (wasFound) { printf("%s", ruWord); } else { printf("Word not found"); } fclose(input); _getch(); }

6. Numëroni numrin e rreshtave në skedar. Do ta lexojmë skedarin karakter për karakter, duke numëruar numrin e karaktereve "\n" derisa të hasim karakterin EOF. EOF është një karakter special që tregon se hyrja është e plotë dhe nuk ka më të dhëna për të lexuar. Funksioni kthen një vlerë negative në rast gabimi.
SHËNIM: EOF është i tipit int, kështu që ju duhet të përdorni int për të lexuar karakteret. Për më tepër, vlera e EOF nuk është e përcaktuar me standard.

#define _CRT_SECURE_NO_WARNINGS #include #përfshi #përfshi int cntLines(const char *emri i skedarit) (int lines = 0; int any; //any është i llojit int sepse EOF është i llojit int! FILE *f = fopen(emri i skedarit, "r"); nëse (f == NULL ) ( return -1; ) bëj ( any = fgetc(f); //printf ("%c", any);//debug if (any == "\n") (linja++;) ) while(any ! = EOF (fclose) ) void main()

Ru-Cyrl 18-tutorial Sypachev S.S. 1989-04-14[email i mbrojtur] Stepan Sypachev

nxënësit

Ende nuk është e qartë? – shkruani pyetje në kutinë postare

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

përfaqëson aftësitë e leximit nga një skedar dhe shkrimit 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

    • 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

      numëro - numri maksimal bajt 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, klasa të 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. Të paracaktuara GetBytes (tekst) // shkrimi i një grupi bajtesh në një skedar fstream fstream = Skedari OpenRead(@"C:\SomeDir\noname\note.txt")) ( // konverto vargun në bajt array byte = bajt i ri; // lexo të dhënat fstream.Read(array, 0, array. Gjatësia);

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ë grup bajt 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ë, ne 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ë hyrje = Encoding.Default.GetBytes(tekst) // shkruaj një grup bajtesh në një skedar fstream.Write(input, 0, input.Length). Zhvendosni treguesin në fund të skedarit, pesë bajt në fund të skedarit fstream.Seek(-5, SeekOrigin.End). Dalja e byte-it të pozicionit aktual = bajt i ri (dalje, 0, dalje. Gjatësia // dekodoni bajtet në një varg tekstiFromFile = Encoding.Default.GetString(output.WriteLine("Tekst nga skedari: (0)); , tekstiNga skedari fjala bota tek vargu i fjalës zëvendësimText = "shtëpia".Seek(-5,SeekOrigin.End); GetBytes (replaceText , 0, input.Length);

// lexo të gjithë skedarin // ktheje treguesin në fillim të skedarit fstream.Seek(0, SeekOrigin.Begin);

output = bajt i ri;

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ë gjitha deklaratat 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 duke përdorur, atëherë duhet të thërrasim në mënyrë eksplicite metodën Close(): fstream.Close()

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"); return EXIT_FAILURE; ) while(fgets(cArray, LEN, pTextFile) != NULL) (printf("%s", cArray); ) fclose(pTextFile return 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) (puts("Problems"); return EXIT_FAILURE; ) fprintf(pTextFile, "%s%c", cString, cNewLine );

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.



Ju pëlqeu artikulli? Ndani me miqtë tuaj!