Proč je fgets lepší než fscanf pro bezpečné čtení souborů v C

12

Přestaňte používat fscanf ke čtení textových souborů. Je to past. Pokud vaše data nejsou dokonale naformátována do posledního místa, fscanf se zhroutí, přeruší zarovnání a zanechá ve vás noční můru s laděním. Spolehlivá cesta? Otevřete soubor v režimu r, použijte fgets k zachycení celých řádků a poté analyzujte části, které potřebujete.

Zde je jednoduchý způsob, jak přečíst soubor a zobrazit jeho obsah na obrazovce, aniž by došlo k pádu systému.

Logika je zde zdánlivě jednoduchá. fgets načte řetězec o délce až 1000 znaků do této vyrovnávací paměti a vrátí NULL, pouze když je dosaženo konce souboru. Vydává data přímo do stdout přes printf. Všimli jste si absence \n ve formátovacím řetězci printf? Toto je záměrné. fgets automaticky přidá znak nového řádku na konec přečteného řádku. Pokud přidáte vlastní \n, získáte dvojité mezery. Ještě důležitější je, že pokud je řádek delší než 1000 znaků, fgets nepřidá znak nového řádku. Toto částečné čtení můžete zjistit kontrolou nepřítomnosti \n, což je užitečná technika při práci s neplatnými daty.

“K přečtení každého řádku použijte fgets a poté analyzujte části, které potřebujete.”

Existuje jedna kritická chyba, která mate i zkušené vývojáře. Vyhněte se překlepům fclose tím, že místo toho napíšete zavřít. Kompilátor si toho nevšimne. Funkce close existuje a u malých skriptů, které otevírají a zavírají soubor pouze jednou nebo dvakrát, se může zdát, že vše funguje dobře. To je lež.

Pokud to spustíte uvnitř smyčky, close nebude schopno správně uvolnit základní zdroje souboru. Nakonec vašemu programu dojdou dostupné popisovače souborů nebo místo v paměti a dojde k selhání. fclose je jediný správný způsob, jak zavřít soubor. “zavřít” je zkratka vedoucí k nefunkčnosti. Držte se standardní knihovny. Zkontrolujte své nárazníky. Nedovolte, aby vám překlep pohltil paměť.