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

Usunięta treść Dodana treść
Znaczniki: Z urządzenia mobilnego Z wersji mobilnej (przeglądarkowej)
Nie podano opisu zmian
Linia 28:
Napiszmy zatem nasz pierwszy program, który stworzy plik "test.txt" i umieści w nim tekst "Hello world":
 
<sourcesyntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h>
Linia 44:
return 0;
}
</syntaxhighlight>
</source>
 
Teraz omówimy najważniejsze elementy programu. Jak już było wspomniane wyżej, do identyfikacji pliku używa się wskaźnika na strukturę <tt>FILE</tt> (czyli <tt>FILE *</tt>). Funkcja '''fopen''' zwraca ów wskaźnik w przypadku poprawnego otwarcia pliku, bądź też NULL, gdy plik nie może zostać otwarty. Pierwszy argument funkcji to nazwa pliku, natomiast drugi to ''''tryb dostępu''' - '''w''' oznacza "write" (pisanie). Zwrócony "uchwyt" do pliku będzie mógł być wykorzystany jedynie w funkcjach zapisujących dane. I odwrotnie, gdy otworzymy plik podając tryb '''r''' ("read", czytanie), będzie można z niego jedynie czytać dane. Funkcja fopen została dokładniej opisana w odpowiedniej [[C/fopen|części]] rozdziału o bibliotece standardowej.
Jak zatem uprościć nazwę typu <tt>FILE*</tt>? Używając [[C/Typy złożone|typedef]]:
<sourcesyntaxhighlight lang="c">
typedef FILE* plik;
plik fp;
</syntaxhighlight>
</source>
 
Po zakończeniu korzystania z pliku należy plik zamknąć. Robi się to za pomocą funkcji [[C/fclose|fclose]]. Jeśli zapomnimy o zamknięciu pliku, wszystkie dokonane w nim zmiany zostaną utracone!
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:
<sourcesyntaxhighlight lang="C">
fp = fopen ("tego pliku nie ma", "r");
if( fp == NULL )
Linia 90:
exit(-10);
}
</syntaxhighlight>
</source>
dostaniemy komunikat:
błąd otwarcia pliku: No such file or directory
Linia 98:
]</ref>
 
<sourcesyntaxhighlight lang=c>
 
 
Linia 119:
}
 
</syntaxhighlight>
</source>
 
===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ń:
<sourcesyntaxhighlight lang="C">
#include <stdio.h>
#include <stdlib.h>
Linia 152:
return 0;
}
</syntaxhighlight>
</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:
<sourcesyntaxhighlight lang="C">
#include <stdio.h>
Linia 178:
return 0;
}
</syntaxhighlight>
</source>
Znajomość rozmiaru pliku przydaje się w wielu różnych sytuacjach, więc dobrze przeanalizuj przykład!
 
Linia 201:
*nagłówka pliku używana jest funkcja [[C/fprintf|fprintf]], która zapisuje do plików binarnych lub tekstowych
*tablicy do pliku używana jest funkcja [[C/fwrite|fwrite]], która zapisuje do plików binarnych,
<sourcesyntaxhighlight lang="c">
#include <stdio.h>
int main() {
Linia 221:
return 0;
}
</syntaxhighlight>
</source>
 
W powyższym przykładzie dostęp do danych jest '''sekwencyjny'''.
Linia 248:
Bardzo łatwo również utworzyć plik SVG<ref>[[:commons:File:Poincare_halfplane_eptagonal_hb.svg|Tworzenie pliku SVG - Claudio Rocchini]]</ref>
 
<sourcesyntaxhighlight lang=c>
/*
 
Linia 325:
 
 
</syntaxhighlight>
</source>
 
== Co z katalogami? ==