Temat: Funkcje działające na plikach tekstowych.
Proceduralne podejście do operacji wejścia-wyjścia
Operacje wejścia-wyjścia odbywają się za pośrednictwem strumieni. Dostęp do zawartości strumienia
jest realizowany za pomocą funkcji. Strumienie i funkcje są dostępne w programie po podłączeniu biblioteki stdio.h
Najważniejsze standardowe strumienie (są one zawsze otwarte i dostępne w programie):
stdin - strumień wejściowy (konsola),
stdout - strumień wyjściowy (konsola) ,
stderr - strumień komunikatów błędów (konsola).
Przebieg operacji na strumieniu plikowym.
int main (int argc, char* argv[])
{
FILE *strumien;
char *nazwa = „d:\\dane\\tekst.txt”; //dla bieżącego folderu wystarczy sama nazwa pliku
if ((strumien=fopen(nazwa, „wt”))= =NULL) //otwarcie strumienia plikowego
{
puts(„Blad otwarcia strumienia”);
return 1;
}
// przetwarzanie strumienia plikowego za pomocą odpowiednich funkcji
fclose(strumien); // int fclose(FILE *stream) zamkniecie strumienia plikowego
return 0;
}
Otwieranie strumienia.
FILE *fopen (char *sciezka, char *sposob );
Funkcja otwiera plik określony scieżką w trybie dostępu określonym zmienną sposob i zwraca wskaźnik na strumień skojarzony z właśnie otwartym plikiem. Zmienna „sposób” kończy się literą t jeżeli plik jest otwierany w trybie tekstowym lub literą b - jeśli w trybie binarnym.
Znaki poprzedzające literę t albo b mają następujące znaczenie:
r - tryb tylko do odczytu,
w - tryb do zapisu. Istniejący plik o tej samej nazwie utraci swoją dotychczasową zawartość,
a - dopisywanie na końcu pliku jeśli plik istnieje, a jeśli nie - tworzony jest nowy plik,
r+ -tryb modyfikacji zawartości pliku,
w+ -utwórz nowy plik do zapisu i odczytu jednocześnie. Jeśli plik istnieje, to będzie nadpisywany.
a+ -zapis i odczyt na końcu wskazanego pliku albo utworzenie nowego, jeśli jeszcze nie istnieje.
Wybrane funkcje wyjścia do pliku.
int fputs (char *s, FILE *strumien);
Funkcja wysyła łańcuch określony zmienną s do strumienia określonego drugim parametrem wywołania
funkcji. Nie zapisuje w pliku znaku końca łańcucha ani znaku końca wiersza. W przypadku powodzenia
zapisu funkcja zwraca wartość nieujemną, w przeciwnym razie zwraca EOF.
int fputc (int c, FILE *strumien) ;
Funkcja wysyła do strumienia znak określony parametrem c. Wartością funkcji jest wysłany znak,
w przypadku błędu zaś EOF.
int fprintf (FILE *strumien, char *format, …);
Funkcja działa podobnie jak printf, ale zapisuje dane do strumienia.
Wybrane funkcje odczytujące plik.
int fgetc (FILE *strumien);
Funkcja odczytuje jeden znak ze strumienia. W przypadku powodzenia odczytu zwraca właśnie ten znak przekonwertowany do typu int. W przypadku osiągnięcia końca zbioru (czyli EOF) lub błędu odczytu
funkcja zwraca właśnie EOF.
char *fgets(char *s, int n, FILE *strumien);
Funkcja odczytuje znaki ze strumienia i umieszcza je w łańcuchu s. Odczyt jest przerywany po odczytaniu n-1 znaków lub znaku końca wiersza. Funkcja fgets umieszcza na końcu łańcucha s znak końca wiersza oraz znak `\0', oznaczający koniec łańcucha.
Wartością funkcji w przypadku powodzenia jest s, w przeciwnym razie (napotkanie EOF pliku lub błąd)
adres pusty NULL.
int fscanf (FILE *strumien, char *format, adresy_zmiennych_pamietajacych_odczytane_dane);
Funkcja odczytuje dane ze strumienia jeżeli odpowiadają one wzorcowi zawartemu w zmiennej format.
Zwraca liczbę prawidłowo dopasowanych danych albo EOF gdy osiągła koniec pliku. Wzorzec formułuje się tak samo jak w funkcji scanf.
Funkcje sterujące wskaźnikiem bieżącej pozycji w strumieniu .
Funkcje z tej kategorii przesuwają wskaźnik bieżącej pozycji w strumieniu lub informują o jego położeniu. Przykładowe funkcje: fseek, fsetpos, fgetpos, ftell.
int fseek (FILE *strm, 0, SEEK_SET);
Funkcja przesuwa wskaźnik bieżącej pozycji na początek pliku. W przypadku niepowodzenia operacji zwraca zero. Drugim parametrem jest liczba typu long określająca przesunięcie względem SEEK_SET.
int fseek(FILE *strm, 0, SEEK_END);
Funkcja przesuwa wskaźnik bieżącej pozycji na koniec pliku. W przypadku niepowodzenia operacji zwraca zero.
long ftell(FILE *strm);
Funkcja zwraca wartość typu long int, będącą bieżącym położeniem wskaźnika pozycji liczonym od początku pliku.
verte
int fsetpos(FILE *strm, long *zmienna);
Ustawia wskaźnik bieżącej pozycji w pliku w położeniu określonym parametrem zmienna, liczonym od początku pliku.
int fgetpos(FILE *strm, long *zmienna);
Odczytuje położenie wskaźnika bieżącej pozycji w pliku, liczone od początku pliku, i umieszcza je
w parametrze typu wskaźnik na long.
Obie powyższe funkcje zwracają wartość zero w przypadku niepowodzenia operacji.
Zadanie
Dany plik tekstowy zawierający kilkanaście wierszy z liczbami oddzielonymi spacja. W każdym wierszu jest tyle samo liczb ale programista nie może sobie założyć ze zawsze jest ich 10. Napisz program który wczyta wszystkie liczby do tablicy dwuwymiarowej a nastepnie wyświetli je na ekranie. Wspomniana tablica powinna być tablica o rozmiarze przydzielanym dynamicznie.
Za 1 razem trzeba wczytac tylko pierwszy wiersz pliku aby stwierdzić ile ma liczb
// za pomoca funkcji Fgets i strtok
Dowiemy się ile liczb znajduje się w wierszach. Pozniej wywołać funkcje fgets w petli i dzieki temu dowiemy się ile wierszy zawiera nasz plik petla skonczy się wtedy gdy fgets zwroci null lub endoffile
Cos
Utwórz tablice dynamiczna bo znamy jej rozmiary
Wywolujemy w petli funkcje skanf tak dlugo jak zwroci null Lub eof
Fskanf będzie ladowalo liczby z pliku do naszej tablicy dwuwymiarowej z tym ze trzeba pamiętać w którym momencie musimy zmienic wiersz w naszej tablicy
Po wczytaniu zawartość tego pliku zamykamy plik funkcja fclose