C/Czytanie i pisanie do plików: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Nie podano opisu zmian
Linia 83:
=== Obsługa błędów ===
Jeśli nastąpił błąd, możemy się dowiedzieć o jego przyczynie na podstawie zmiennej [[C/errno|errno]] zadeklarowanej w [[C/Biblioteka standardowa|pliku nagłówkowym]] [[Programowanie:C:Biblioteka standardowa:Indeks tematyczny#errno.h|errno.h]]. Możliwe jest też wydrukowanie komunikatu o błędzie za pomocą funkcji [[C/perror|perror]]. Na przykład używając:
<source lang="C">
fp = fopen ("tego pliku nie ma", "r");
if( fp == NULL )
Linia 89 ⟶ 90:
exit(-10);
}
</source>
dostaniemy komunikat:
błąd otwarcia pliku: No such file or directory
Linia 121 ⟶ 123:
===Zaawansowane operacje===
Pora na kolejny, tym razem bardziej złożony przykład. Oto krótki program, który swoje wejście zapisuje do pliku o nazwie podanej w linii poleceń:
<source lang="C">
 
#include <stdio.h>
#include <stdlib.h>
Linia 147 ⟶ 149:
return 0;
}
</source>
 
Tym razem skorzystaliśmy już z dużo większego repertuaru funkcji. Między innymi można zauważyć tutaj funkcję [[C/fputc|fputc()]], która umieszcza pojedynczy znak w pliku. Ponadto w wyżej zaprezentowanym programie została użyta stała EOF, która reprezentuje koniec pliku (ang. ''End Of File''). Powyższy program otwiera plik, którego nazwa przekazywana jest jako pierwszy argument programu, a następnie kopiuje dane z wejścia programu (''stdin'') na wyjście (''stdout'') oraz do utworzonego pliku (identyfikowanego za pomocą fp). Program robi to tak długo, aż naciśniemy kombinację klawiszy Ctrl+D (w systemach Unixowych) lub Ctrl+Z(w Windows), która wyśle do programu informację, że skończyliśmy wpisywać dane. Program wyjdzie wtedy z pętli i zamknie utworzony plik.
 
== Rozmiar pliku ==
Dzięki standardowym funkcjom języka C możemy m.in. określić długość pliku. Do tego celu służą funkcje [[C/fsetpos|fsetpos]], [[C/fgetpos|fgetpos]] oraz [[C/fseek|fseek]]. Ponieważ przy każdym odczycie/zapisie z/do pliku wskaźnik niejako "przesuwa" się o liczbę przeczytanych/zapisanych bajtów. Możemy jednak ustawić wskaźnik w dowolnie wybranym miejscu. Do tego właśnie służą wyżej wymienione funkcje. Aby odczytać rozmiar pliku powinniśmy ustawić nasz wskaźnik na koniec pliku, po czym odczytać ile bajtów od początku pliku się znajdujemy. Użyjemy do tego tylko dwóch funkcji: [[C/fseek|fseek]] oraz [[C/fgetpos|fgetpos]]. Pierwsza służy do ustawiania wskaźnika na odpowiedniej pozycji w pliku, a druga do odczytywania na którym bajcie pliku znajduje się wskaźnik. Kod, który określa rozmiar pliku znajduje się tutaj:
<source lang="C">
 
#include <stdio.h>
Linia 173 ⟶ 175:
return 0;
}
</source>
 
Znajomość rozmiaru pliku przydaje się w wielu różnych sytuacjach, więc dobrze przeanalizuj przykład!