Ten post chciałbym poświęcić metodzie wprowadzania i odczytywania danych z pliku tekstowego.
Dostęp wysokopoziomowy wykorzystuje następujące funkcje pozwalające na uzyskanie dostępu do pliku. Są to funkcje fopen(), fread(), fclose(). Dodatkowo należy wykorzystać wskaźnik, który będzie pokazywał na strukturę FILE. Będzie ona przechowywać informacje o pliku. Kolejną grupą jest dostęp niskopoziomowy, który obsługuje takie funkcje jak read(), open(), write() czy close().
Należy pamiętać, że dostępy muszą być od siebie oddzielone. Nie można na jednym otwartym pliku operować metodami niskopoziomowi po czym przejść na wysokopoziomowe przed całkowitym zamknięciem pliku.
Program
Od razu przejdę do programów przykładowych. Pierwszy z nich będzie wprowadzał dane wpisane z klawiatury do pliku. Po czym nastąpi zamknięcie pliku i ponowne jego otwarcie aby odczytać wprowadzone dane.
Wszystkie wykorzystywane funkcje zostały opisane bezpośrednio w programie:
- #include <stdio.h>
- #include <stdlib.h>
- int main ()
- {
- //Definicja identyfikatora do pliku
- FILE *fp;
- //Definicja wymaganych zmiennych
- char zapis[100];
- char odczyt[100];
- int i = 0;
- printf("Wprowadz dane do pliku\n");
- //Wczytanie danych z pliku
- while(scanf("%c", &zapis[i]) == 1)
- {
- if(zapis[i]=='\n')
- {
- break;
- }
- ++i;
- }
- //Otwarcie bądź stworzenie pliku,
- //z parametrem w czyli zapis
- if ((fp=fopen("nowyplik.txt", "w"))==NULL)
- {
- //
- printf ("Nie można otworzyć pliku w celu dokonania zapisu!\n");
- exit(1);
- }
- //wpisanie tekstu do pliku
- fprintf (fp, "%s", zapis);
- fclose (fp);
- //Ponowne otwarcie pliku w cely odczytania danych
- if ((fp=fopen("nowyplik.txt", "r"))==NULL)
- {
- printf ("Nie można otworzyć pliku w celu dokonania zapisu!\n");
- exit(1);
- }
- //Pobranie znaków do tablicy odczyt z pliku
- fgets(odczyt,100,fp);
- //wyświetlenie pobranych danych
- printf("%s", odczyt);
- //zamknięcie pliku
- fclose(fp);
- return 0;
- }
Poniżej lekko zmodyfikowany program pozwalający na wyświetlanie rozmiaru pliku po wczytaniu z niego danych.
- #include <stdio.h>
- #include <stdlib.h>
- int main ()
- {
- //Definicja identyfikatora do pliku
- FILE *fp;
- fpos_t rozmiar;
- //Definicja wymaganych zmiennych
- char zapis[100];
- char odczyt[100];
- int i = 0;
- printf("Wprowadz dane do pliku");
- //Wczytanie danych z pliku
- while(scanf("%c", &zapis[i]) == 1)
- {
- if(zapis[i]=='\n')
- {
- break;
- }
- ++i;
- }
- //Otwarcie bądź stworzenie pliku,
- //z parametrem w czyli zapis
- if ((fp=fopen("nowyplik.txt", "w"))==NULL)
- {
- //
- printf ("Nie można otworzyć pliku w celu dokonania zapisu!\n");
- exit(1);
- }
- //wpisanie tekstu do pliku
- fprintf (fp, "%s", zapis);
- fclose (fp);
- //Ponowne otwarcie pliku w cely odczytania danych
- if ((fp=fopen("nowyplik.txt", "r"))==NULL)
- {
- printf ("Nie można otworzyć pliku w celu dokonania zapisu!\n");
- exit(1);
- }
- //Pobranie znaków do tablicy odczyt z pliku
- fgets(odczyt,100,fp);
- //wyświetlenie pobranych danych
- printf("%s", odczyt);
- //znalezienie konca pliku
- fseek (fp, 0, SEEK_END);
- //Umieszczenie aktualnej pozycji wskaznika w zmiennej rozmiar
- fgetpos (fp, &rozmiar);
- //Wyswietlenie rozmiaru pliku w bajtach
- printf ("Rozmiar pliku: %d\n", rozmiar);
- //zamknięcie pliku
- fclose(fp);
- return 0;
- }
Za pomocą funkcji wyszukującej koniec pliku można wykonać zapisywanie danych za ostatnią pozycją w pliku. Do tego należy dodać jeszcze funkcję fsetpos(), która ustawi wskaźnik na wskazaną pozycję. Należy ją wywołać po funkcji fgetpos(). Bez ich wykorzystania dane będą za każdym razem dopisywane na początku pliku tekstowego. Przez co będą one co zapis wymazywane.