6 Programowanie w języku C
Transkrypt
6 Programowanie w języku C
Język C, Laboratorium nr 6 Instrukcja laboratoryjna nr 6 1/2 Programowanie w języku C Temat: Wskaźniki i obsługa plików Przygotował: dr inż. Grzegorz Łukawski 1) Wskaźniki 1.1) Wskaźniki i operatory W Z Wskaźnik (adres) to zmienna wskazująca inną zmienną. Dwa podstawowe operatory: • Jednoargumentowy operator tworzący wskaźnik na podaną zmienną: w = &z; • Jednoargumentowy operator wyłuskania wykonujący operację odwrotną (adresowanie pośrednie): z = *w; 1.2) Zastosowanie wskaźników Jednym z podstawowych zastosowań wskaźników jest przekazywanie argumentów funkcji przez wskaźnik. Umożliwia to zwrócenie więcej niż 1 wyniku przez funkcję, np.: void dodaj_czas(int *godz, int *min, int czas) { *min += czas; while(*min > 59) { *godz += 1; *min -= 60; } } Funkcja dodaje przesunięcie w minutach do podanego przez godz:min czasu. 2) Operacje plikowe 2.1) Zmienna plikowa Zmienna przechowująca uchwyt (deskryptor) otwartego pliku ma postać wskaźnika do typu FILE, np.: FILE *plik; Funkcje operujące na plikach są dostępne po dołączeniu pliku nagłówkowego: #include <stdio.h> 2.2) Otwarcie i zamknięcie pliku • plik = fopen(nazwa, tryb); Otwarcie wskazanego przez nazwę pliku. W przypadku błędu funkcja zwraca wartość NULL. tryb – ciąg znaków, np.: “r” - otwarcie do odczytu, “w” - do zapisu, “a” - dopisywanie, “rb” - do odczytu w trybie binarnym, itp. • fclose(plik); Zamknięcie pliku. 2.3) Odczyt i zapis pojedynczych znaków • int getc(plik); Odczyt jednego (kolejnego) znaku z otwartego pliku. Gdy koniec pliku – wartość EOF. • putc(znak,plik); Zapis jednego znaku do pliku. 2.4) Odczyt i zapis linii tekstu • fgets(char* line, int maxline, plik); Wczytuje jeden wiersz wraz ze znakiem nowej linii (maksymalnie maxline znaków), dodaje \0. Zwraca NULL gdy błąd. Język C, Laboratorium nr 6 • 2/2 fputs(char* line, plik); Zapisuje wiersz do pliku dodając znak nowej linii. Zwraca EOF gdy błąd. 2.5) Odczyt i zapis linii tekstu z formatowaniem • fscanf(plik, format, &zmienna1, &zmienna2, ...); Wczytuje dane z pliku zgodnie z podanym formatem (analogicznie do scanf()). • fprintf(plik, format, zmienna1, zmienna2, ...); Zapisuje dane do pliku zgodnie z podanym formatem (analogicznie do printf()). 2.6) Odczyt i zapis surowych danych • fread(buf, size, nobj, plik); Odczytuje z pliku size*nobj bajtów danych i umieszcza w podanym buforze. Zwraca ilość poprawnie odczytanych obiektów (wartość <= nobj). • fwrite(buf, size, nobj, plik); Zapisuje do pliku size*nobj bajtów danych z podanego bufora. Zwraca ilość poprawnie zapisanych obiektów (wartość <= nobj). 2.7) Błędy • ferror(); • feof(plik); Po wystąpieniu jakiegokolwiek błędu zwraca wartość !=0. Zwraca wartość !=0 gdy koniec pliku. 2.8) Pozycja w pliku Wraz z każdą operacją odczytu/zapisu przesuwa się wskaźnik bieżącego położenia w pliku. Można go także przemieścić w dowolne miejsce z pomocą funkcji: • int fseek(plik, long offset, int origin); Przesuwa wskaźnik o podany offset zgodnie z ostatnim parametrem: SEEK_SET – względem początku pliku, SEEK_CUR – względem aktualnej pozycji, SEEK_END – względem końca pliku. • long ftell(plik); Zwraca bieżącą pozycję w pliku. 3) Argumenty programu main(int ArgC, char *ArgV[]) {...} ArgC – ilość argumentów (minimum 1); ArgV[0] – zawsze obecna nazwa programu; ArgV[1], ArgV[2],... – pierwszy i kolejne argumenty. 4) Przykład Funkcja wyświetla na ekranie wskazany przez nazwę plik, zwraca -1 w przypadku błędu. int wyswietl(char *pl) { FILE *plik;int znak; plik = fopen(pl, ”r”); if(!plik) return(-1); while(1) { znak = getc(plik); if(znak == EOF) break; putchar(znak); } fclose(plik);return(0); } // Błąd otwarcia pliku // Odczyt jednego znaku // Koniec pliku // Jeden znak na ekran // Zamknięcie pliku i koniec