Waarom fgets fscanf verslaat voor veilig lezen van bestanden in C

6

Stop met het gebruik van fscanf om tekstbestanden te lezen. Het is een val. Tenzij uw gegevens perfect zijn geformatteerd tot aan de laatste witruimte, zal fscanf stikken, verkeerd uitlijnen en u een nachtmerrie bezorgen voor het opsporen van fouten. Het betrouwbare pad? Open met de r -modus, gebruik fgets om hele regels te pakken en analyseer daarna de stukken die je nodig hebt.

Hier is de eenvoudige manier om een ​​bestand te lezen en de inhoud ervan naar het scherm te dumpen zonder uw systeem te laten crashen.

De logica hier is bedrieglijk eenvoudig. fgets leest een regel van maximaal 1.000 tekens in deze buffer en retourneert alleen ‘NULL’ als de markering voor het einde van het bestand wordt bereikt. Het drukt rechtstreeks af naar stdout via printf. Merk je het ontbreken van \n op in de tekenreeks printf? Dat is opzettelijk. fgets voegt automatisch het newline-teken toe aan het einde van de tekenreeks die het leest. Als u uw eigen \n toevoegt, krijgt u dubbele spatiëring. Belangrijker nog: als een regel langer is dan 1000 tekens, zal fgets de nieuwe regel niet toevoegen. Je kunt deze onvolledige lezing detecteren door te controleren op de ontbrekende \n, een handige truc als je te maken hebt met verkeerd ingedeelde gegevens.

“Gebruik fgets om elke regel in te lezen en ontleed vervolgens de stukken die je nodig hebt.”

Er is één kritieke fout waar zelfs doorgewinterde ontwikkelaars over struikelen. Typ fclose niet als close. De compiler zal het niet opvangen. De close -functie bestaat, en voor kleine scripts die een bestand slechts één of twee keer openen en sluiten, lijkt het misschien prima te werken. Het is een leugen.

Als je dit in een lus uitvoert, slaagt close er niet in om de onderliggende bestandsbronnen op de juiste manier vrij te geven. Uiteindelijk heeft uw programma geen beschikbare bestandshandvatten of geheugenruimte meer en crasht het hard. fclose is de enige juiste manier om de deur te sluiten. ‘sluiten’ is een snelkoppeling die naar een steen leidt. Houd u aan de standaardbibliotheek. Houd uw buffers gecontroleerd. Laat een typfout je geheugen niet opeten.