[ Pobierz całość w formacie PDF ]
buf = latin[i];
break;
}
fwrite(&buf,sizeof(BYTE),1,fp_out);
}
fseek(fp_out,0,SEEK_SET); //na poczÄ…tek zbioru
for( ; !feof(fp_out); )
{
fread(&buf, sizeof(BYTE), 1, fp_out);
putchar(buf);
}
fcloseall();
exit(0);
}
OBSAUGA BADÓW
W początkowej fazie używania operacji we/wy pojawia się wiele błędów, dających dość nieoczekiwane
efekty. Dla tego, pożytecznym jest nawyk sprawdzania poprawności wykonywanych operacji, w celu
łatwiejszego wykrywania błędnych działań programu. Gdy jakaś operacja nie powiodła się, pojawia się błąd
i dla danego strumienia ustawiany jest wskaznik błędu.
Do testowania wskaznika błędu i sprawdzania, czy w danej operacji zapisu/odczytu powstał błąd służy
funkcja:
int ferror(fp);
zwraca 0 jeśli nie stwierdzono błędu, !0 w przeciwnym przypadku
Jeśli powstał błąd, to wskaznik błędu pozostaje ustawiony aż do momentu zamknięcia strumienia, lub
użycia funkcji:
void clearerr(fp);
ustawia wskaznik błędu lub EOF na 0;
lub omówionej wcześniej funkcji :
rewind(fp);
Przykład - otwarcie do odczytu i próba zapisu
#include
FILE *fp;
char *string = "This should never be written";
main()
{
fp = fopen("data","r");
fprintf(fp, "%s
",string);
if (ferror(fp))
{
fprintf(stderr, "Write error
");
clearerr(fp);
}
7. Operacje we/wy niskiego poziomu
Operacje tego typu - "low-level" manipulujÄ… na danych nieformatowanych i niebuforowanych. Zbiory
otwarte poprzez wywołanie funkcji niskiego poziomu kojarzone są ze zmienną "file handle", całkowita
zmienną poprzez która system operacyjny dociera do zbioru.
Chociaż operacje niskiego poziomu nie wymagają bibliotek
np. EOF zdefiniowanymi tamże. W związku z tym, w programie używającym predefiniowane zmienne
biblioteka ya musi być dołączona. Deklaracje funkcji low-level zawarte są w zbiorze
OTWARCIE ZBIORU
Podobnie jak to było dla funkcji strumieniowych, przed przystąpieniem do pracy ze zbiorem, zbiór ten
należy otworzyć jedną z funkcji: open, sopen, create. Wszystkie te funkcje zwracaja "file handle"
int open("nazwa",mode,pmode);
Otwiera zbiór o podanej nazwie w jednym z trybów mode:
O_APPEND - ustawia wskaznik fp na koniec zbioru przed zapisem
O_BINARY - otwiera w trybie binarnym
O_CREATE - tworzy i otwiera nowy zbiór. Nie działa gdy zbiór istnieje.
O_RDONLY - tylko do odczytu
O_WRONLY 0 tylko do zapisu
i inne
połączenie trybów:
O_WRONLY | O_BINARY
parametr pmode działa tylko wtedy gdy ustawiony jest O_CREATE:
S_IWRITE - dozwolony zapis
S_IREAD - dozwolony odczyt
S_IWRITE | S_IREAD - dozwolony odczyt/zapis
int create("nazwa",tryb);
Funkcja zarówno tworzy nowy zbiór, lub obcina istniejący zbiór. Jeśli zbiór nie istnieje, jest tworzony i
otwierany do zapisu. Jeśli istnieje, kasuje jego poprzednia zawartośc i otwiera do zapisu.
pmode jak wyżej
Predefiniowane "file handle"
W momencie rozpoczynania programu do standardowych we/wy przypisywanych jest 5 "file handle":
stdin 0 stderr 2 stdprn 4
stdout 1 stdoux 3
Standardowe zbiory otwierane są automatycznie w momencie rozpoczęcia programu.
ODCZYT I ZAPIS DO ZBIORU
W przeciwieństwie do funkcji strumieniowych mamy dwie funkcje write, read. Operacje we/wy
wykonywane są od bieżącego fp, który aktualizowany jest po każdej operacji zapisu i odczytu. Do
testowania warunku końca zbioru może być użyta procedura eof. W razie wystąpienia błędu, operacje te
ustawiajÄ… errno.
int read(fh,buf,count);
Czyta do bufora count bajtów ze zbioru skojarzonego z fh.
int write(fh,buf,count);
zapisuje z bufora do zbioru skojarzonego zfh count bajtów
Obie funkcje zwracają ilość zapisanych/odczytanych bajtów. Jeśli jest
realizacji funkcji.
FUNKCJE POMOCNICZE
long seek(fh,offset,origin)
przesuwa fp do nowej pozycji oddalonej od origin o offset bajtów.
Zwraca offset (w bajtach)
long tell(fh);
podaje bieżącą pozycję fp w zbiorze skojarzonym przez fh. Pozycja to liczba bajtów od początku zbioru.
ZAMYKANIE ZBIORU
int close(fh);
zwraca 0 gdy pomyślnie zamknie zbiór, lub -1 gdy powstał błąd.
Przykład - zapis do zbioru
#include
#include
#include
char buffer[100] = "To jest zapis do zbioru";
main()
{
int fh;
unsigned int nbytes = 100, byteswritten;
if((fh=open(a:dane.dat",O_WRONLY)) == -1)
{
perror("błąd otwarcia");
exit(1);
}
if((byteswritten =write(fh,buffer,nbytes) ) == -1)
perror(" ");
else
printf("Wrote %u bytes to file
",byteswritten);
}
UWAGA!!!
Urządzenia zewnętrzne (np.konsola) nie maja wskazników do pliku, więc rezultat funkcji seek lub tell jest
[ Pobierz całość w formacie PDF ]