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