Cum funcționează un pointer FILE în C? (Programare, C, Fișier)

OldSchool a intrebat.

Dacă scriem:

//in main

FILE *p = fopen("filename", "anymode");

Întrebarea mea este: la ce este p punctând?

3 răspunsuri
Jonathan Leffler

Pointerul de fișier p indică o structură gestionată de biblioteca C care gestionează funcționalitatea de I/O pentru fișierul numit în modul de deschidere dat.

Nu puteți spune, a priori, dacă ceea ce indică este memorie alocată static sau dinamic; nu trebuie să știți. Se tratează ca un pointer opac.

Rețineți că standardul spune:

ISO/IEC 9899:2011 7.21.3 Fișiere

Adresa fișierului FILE obiect utilizat pentru a controla un flux poate fi semnificativă; o copie a unei FILE obiect nu trebuie neapărat să servească în locul originalului.

Acest lucru spune (aproximativ): Nu vă jucați cu pointerul; transmiteți-l funcțiilor care au nevoie de el și, în rest, lăsați-l în pace.

Comentarii

  • Printre altele, da, structura la care indică conține un pointer la bufferul pentru fișier. Pe Unix, aceasta înregistrează descriptorul de fișier care stă la baza fluxului de fișiere (probabil un mâner de fișier de un anumit fel pe Windows). Conține informații despre poziția curentă în fișier și în buffer; conține informații despre caracterele respinse; conține toate informațiile de care biblioteca are nevoie pentru a gestiona corect I/O. –  > Por Jonathan Leffler.
  • este că pointerul din structura FILE nu indică fișierul deschis sau indică indirect fișierul deschis prin intermediul bufferului –  > Por OldSchool.
  • Întrebarea dumneavoastră este puțin confuză. Există un tip de structură FILE. Ceea ce primiți înapoi de la fopen() este un FILE *, , care indică un FILE structură. Structura la care se indică conține toate informațiile de care biblioteca are nevoie pentru a gestiona I/O la fișier. O consecință este că rareori conține numele fișierului; acesta nu este necesar odată ce fișierul este deschis. Adresa FILE nu este bufferul; bufferul este o matrice de caractere. Adresa FILE conține un pointer către buffer, fie că este furnizat de sistem, fie că este furnizat de utilizator prin setvbuf() sau setbuf(). […continuare…] –  > Por Jonathan Leffler.
  • […continuare…] Structura conține mai mult decât un simplu pointer către buffer. Nu sunt sigur de detaliile pentru Windows, dar structura conține orice informație necesară la nivelul O/S pentru a gestiona fișierul într-un mod conform cu standardul C. Expresia „indică indirect fișierul deschis prin intermediul buffer-ului” este greșită; buffer-ul este matricea de caractere în care sunt păstrate datele până când sunt citite sau scrise pe disc, astfel încât sistemul nu face operații de intrare/ieșire cu un singur caracter (de obicei; chiar și un fișier fără buffer FILE * evită operațiunile cu un singur caracter atunci când poate). –  > Por Jonathan Leffler.
  • Mulțumesc mult pentru ajutor –  > Por OldSchool.
paxdiablo

p indică o locație de memorie care conține un FILE structură. Asta este tot ce trebuie să știți, conținutul acelei structuri este în întregime specific implementării.

Dacă este implementată corect din punct de vedere al încapsulării (adică, ca o structură opacă), nici măcar nu ar trebui să puteți afla ce conține.

Tot ceea ce ar trebui să faceți cu ea (cu excepția cazului în care sunteți implementatorul bibliotecii standard) este să o primiți de la fopen și să o transmiteți altor funcții care necesită o FILE *, , cum ar fi fwrite, , fread și fclose.

Gheață albastră

p este un pointer către un fișier stocat FILE din fopen().

Acesta este de fapt un pointer către fluxul către fișier, prin intermediul căruia se pot efectua operații. Cu toate acestea, funcționarea internă reală a obiectului este abstractizată.

De la http://www.cplusplus.com/reference/cstdio/fopen/ :

fopen

FILE * fopen ( const char * filename, const char * mode );

Deschide fișierul al cărui nume este specificat în parametrul filename și îl asociază cu un flux care poate fi identificat în operațiile viitoare prin pointerul FILE returnat.

Tags:,