Do pracy z danymi na dysku potrzebny jest deskryptor. W C ten uchwyt jest wskaźnikiem zwracanym przez funkcję fopen. Określasz tryb, otrzymujesz wskaźnik i używasz go do strumieniowego przesyłania danych do lub z pliku. Najpopularniejsze tryby to „r” do odczytu, „w” do zapisu i „a” do dołączenia. Jeśli wybierzesz je nieprawidłowo, możesz utracić dane lub spowodować awarię programu.
Rozważmy proste zadanie: zapisanie liczb od 1 do 10 do pliku.
Ten kod otwiera plik o nazwie out w trybie „w”. Jest to tryb nagrywania nadpisującego (nagrywanie niszczące). Jeśli plik out nie istnieje, system go utworzy. Jeśli już istnieje, jego stara zawartość zostanie całkowicie usunięta i zastąpiona nową. Zmienna f przechowuje wskaźnik do pliku. Ten wskaźnik jest używany do wszystkich kolejnych operacji. Jeśli nie można otworzyć pliku (z powodu problemów z uprawnieniami, zapełnienia dysku lub nieistniejącej ścieżki), f jest ustawiane na NULL.
Funkcja wyjściowa to fprintf. Działa dokładnie tak jak printf, ale pierwszym argumentem jest wskaźnik pliku. Po zakończeniu pracy fclose zwalnia zasób.
Obsługa błędów podczas pracy z plikami w funkcji głównej
Ten fragment kodu jest pierwszym z serii przykładów zwracających kod błędu z funkcji main. Kiedy fopen nie powiedzie się, f zawiera wartość null. W C zero jest interpretowane jako fałszywe. Wszystkie pozostałe wartości są interpretowane jako prawdziwe. Operator ! odwraca tę logikę Boole’a.
Konstrukcja if (!f) sprawdza, czy wskaźnik ma wartość null. Jest to odpowiednik „if (f == 0)”, ale ten pierwszy jest standardowym idiomem. Jeśli warunek jest spełniony, program zwraca kod 1.
W systemach UNIX możesz sprawdzić ten kod zakończenia bezpośrednio z wiersza poleceń. Informuje, czy skrypt lub program został pomyślnie wykonany lub napotkał błąd. Możliwość wychwycenia takich błędów w odpowiednim czasie pozwala zaoszczędzić wiele godzin debugowania w przyszłości.
Po co w ogóle zawracać sobie głowę kodami zwrotnymi, skoro możesz po prostu spowodować awarię? Ponieważ kontrolowane zakończenie jest lepsze niż niezdefiniowane zachowanie. Możesz zarejestrować błąd, powiadomić użytkownika lub spróbować wykonać operację ponownie. Dopuszczenie do cichej awarii programu jest leniwą inżynierią.
Piękno tego podejścia polega na jego prostocie. Otwórz to. Kontrola. Zapisz to. Zamknij to. Żadnej magii. Brak stanu ukrytego. Tylko wskaźnik i plik.
A co, jeśli będziesz musiał ponownie przeczytać to, co właśnie zapisałeś? Lub dodać dane do istniejącego dziennika bez niszczenia historii? Linia trybu zmienia wszystko. r pozostawia plik niezmieniony. a dołącza dane na końcu. w usuwa całą zawartość. Wybierz ostrożnie.















