Cuprins:
- Cum se citește și derulează
- Când un fișier conține înregistrări de toate dimensiunile, puteți utiliza funcția fseek () pentru a scoate orice element individual. Formatul pentru fseek () este
Video: Week 9, continued 2024
Accesarea aleatorie a fișierelor în programarea C nu are nimic de-a face cu numerele aleatoare. Mai degrabă, fișierul poate fi accesat în orice punct de aici, chiar și acolo. Acest tip de acces funcționează cel mai bine atunci când fișierul este punctat cu înregistrări de aceeași dimensiune. Noțiunea de înregistrări aduce structuri care pot fi cu ușurință scrise într-un fișier și apoi recuperate individual, selectiv sau toate simultan.
Cum se citește și derulează
Pe măsură ce programul dvs. citește date dintr-un fișier, acesta urmărește poziția de la care datele sunt citite în fișier. Se menține o poziție a cursorului, astfel încât locația la care codul să citească sau să scrie într-un fișier nu este pierdută.
Când deschideți pentru prima dată un fișier, poziția cursorului este la începutul fișierului, primul byte. Dacă citiți o înregistrare de 40 de octeți în memorie, poziția cursorului este de 40 de octeți de la început. Dacă citiți până la sfârșitul fișierului, poziția cursorului menține acea locație.
indicatorul de fișier , chiar dacă nu este o variabilă a indicelui sau un tip de pointer FILE. Este pur și simplu locația dintr-un fișier în care se citește următorul octet de date. Puteți să vă puneți în poziția cursorului utilizând câteva funcții interesante în C. Două dintre ele sunt ftell () și rewind (). Funcția ftell () returnează poziția curentă a cursorului care este decalată ca o valoare int lungă. Funcția Rewind () mută cursorul înapoi la începutul fișierului.
TELL AND REWIND
#include # include #include int principal () {struct entry {char actor [32]; int an; titlu caractere [32];}; struct de intrare bond; FILE * a007; int count = 0; a007 = fopen ("obligațiune db", "r"); dacă (! a007) {puts ("SPECTER câștigă!"); ieșire (1);} în timp ce (fread (& bond, sizeof (struct entry), 1, a007)) {printf ("% st% dt% sn"; dacă (ftell (a007)> sizeof (intrare struct)) înapoi (a007); conta ++; dacă (numără> 10) se rupe;} fclose (a007); retur (0);}
Pentru a determina offsetul corespunzător, o declarație if compară rezultatul din funcția ftell () și operatorul sizeof pe intrarea structurii. Rețineți că ftell () întoarce doar o valoare lungă int, nu un număr specific de structuri.
Numărul de variabile, declarat și inițializat la linia 14, ține evidența de câte ori se repetă buclă. Dacă nu, programul s-ar derula fără sfârșit. Asta e rău. Deci, atunci când valoarea numărului este mai mare de 10, bucla se rupe și apoi fișierul se închide și programul se termină.
Exercițiu
1 : Tastați codul sursă de la Tell și Rewind în editorul dvs. Construiți și executați pentru a vedea cum funcționează funcțiile ftell () și rewind (). Cum să găsiți o înregistrare specifică
Când un fișier conține înregistrări de toate dimensiunile, puteți utiliza funcția fseek () pentru a scoate orice element individual. Formatul pentru fseek () este
fseek (mâner, offset, wherece);
mâner
este un mâner de fișier, un pointer FILE reprezentând un fișier care este deschis pentru citire. offset este numărul de octeți de la începutul, sfârșitul sau poziția curentă într-un fișier. Și de unde este una dintre cele trei constante: SEEK_SET, SEEK_CUR sau SEEK_END pentru poziția inițială, actuală sau sfârșitul unui fișier. Atâta timp cât fișierul conține înregistrări cu o dimensiune constantă, puteți folosi fseek () pentru a elimina orice înregistrare specifică, așa cum se arată în Găsirea unei înregistrări specifice într-un fișier.
Găsiți o înregistrare specială într-un fișier
#include #include #include int principal () {struct entry {char actor [32]; int an; titlu caractere [32];}; struct de intrare bond; FILE * a007; a007 = fopen ("obligațiune db", "r"); dacă (! a007) {puts ("SPECTER câștigă!"); ieșire (1);} fseek (a007, sizeof (intrare struct) * 1, SEEK_SET); fread (& bond, sizeof (intrare struct), 1, a007); printf ("% st% dt% sn", actor de obligatiuni, obligatiuni an, titlu de obligatiuni); fclose (A007); retur (0);}
Codul afișat în Găsirea unei înregistrări specifice într-un fișier este din nou destul de similar cu codul afișat în Lista 22-9. Adăugarea mare este funcția fseek (), afișată la rândul 21. Setează poziția cursorului astfel încât funcția fread () care urmează (a se vedea linia 22) se citește într-o înregistrare specifică situată în interiorul bazei de date.
La linia 21, funcția fseek () examinează fișierul reprezentat de mânerul a007. Decalajul este calculat prin înmulțirea dimensiunii structurii de intrare.
Ca și în cazul unei matrice, înmulțirea acestei mărimi cu 1 duce la înregistrarea
al doilea în fișier; multiplicați valoarea cu 0 (sau specificați doar 0 în funcție) pentru a citi prima înregistrare. Constanta SEEK_SET asigură că fseek () începe să privească de la începutul fișierului. Efectul net al codului este că a doua înregistrare a obligațiunii. fișierul db este afișat.
Exercițiul 2:
Tastați codul sursă din Găsirea unei înregistrări specifice într-un fișier. Construiți și executați pentru a vedea cea de-a doua înregistrare din fișier.