Geschiedenis van de vraag:
Werken met bestanden in de programmeertaal C is een fundamentele vaardigheid die al in de vroege implementaties van de taal is ontstaan. De standaardbibliotheek van C (stdio.h) biedt universele functies voor invoer- en uitvoerstromen, waardoor programma's overdraagbaar zijn tussen besturingssystemen.
Probleem:
Vaak maken beginnende programmeurs fouten bij het werken met bestandsstromen: ze controleren niet het resultaat van het openen van bestanden, beheren het geheugen voor buffering niet correct en behandelen geen lees- of schrijffouten. Fouten bij het sluiten van bestanden leiden tot resource-lekken, en onjuiste omgang met buffers leidt tot dataverlies.
Oplossing:
Voor een correcte werking met bestanden moet je altijd:
fopen;fread, fwrite, fscanf, fprintf gebruiken voor lezen/schrijven;fclose.Voorbeeldcode:
#include <stdio.h> int main() { FILE *fp = fopen("example.txt", "w"); if (!fp) { perror("Kon bestand niet openen"); return 1; } fprintf(fp, "Hallo, wereld! "); fclose(fp); fp = fopen("example.txt", "r"); if (!fp) { perror("Fout bij het openen van het bestand voor lezen"); return 1; } char buffer[100]; while (fgets(buffer, sizeof(buffer), fp)) { printf("%s", buffer); } fclose(fp); return 0; }
Belangrijke kenmerken:
Kun je een bestand meerdere keren achter elkaar sluiten met fclose?
Nee, dubbel sluiten van een bestandsstroom leidt tot onbepaald gedrag. Na fclose wordt de descriptor ongeldig.
Wat retourneert de functie fread als ze het einde van het bestand bereikt?
fread retourneert het aantal succesvol gelezen elementen. Als het einde van het bestand is bereikt, kan het geretourneerde aantal minder zijn dan verwacht. Je moet altijd feof en ferror controleren voor diagnose.
Kun je dezelfde bestandsstroom tegelijkertijd voor schrijven en lezen gebruiken?
Ja, als het bestand geopend is in de modus "r+" of "w+", maar je moet een aanroep van fflush of een andere bestandspositiebeweging (fseek) doen voordat je van richting verandert (schrijven/lezen). Anders is het gedrag niet gedefinieerd.
FILE * pointer gebruiken na fclose.fflush niet aangeroepen, stroom niet gesloten).Een ontwikkelaar schreef gegevens naar een logbestand zonder de retourwaarde van fopen te controleren. Na het opraken van de descriptors kon het bestand niet meer worden geopend - logberichten gingen verloren.
Voordelen:
Nadelen:
In een andere versie van de code werden altijd alle retourwaarden gecontroleerd (fopen, fwrite, fclose). Bij een fout werd een gedetailleerde diagnostische melding afgedrukt via perror, en het programma werd correct beëindigd, waarbij alle middelen werden vrijgegeven.
Voordelen:
Nadelen: