piątek, 1 lipca 2016

C - Wprowadzanie danych do pliku

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:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main ()
  4. {
  5.    //Definicja identyfikatora do pliku
  6.    FILE *fp;
  7.    
  8.    //Definicja wymaganych zmiennych
  9.    char zapis[100];
  10.    char odczyt[100];
  11.    int i = 0;
  12.    printf("Wprowadz dane do pliku\n");
  13.    
  14.    //Wczytanie danych z pliku
  15.    while(scanf("%c", &zapis[i]) == 1)
  16.    {
  17.        if(zapis[i]=='\n')
  18.        {
  19.            break;
  20.        }
  21.        ++i;
  22.    }
  23.    
  24.    //Otwarcie bądź stworzenie pliku,
  25.    //z parametrem w czyli zapis
  26.    if ((fp=fopen("nowyplik.txt", "w"))==NULL)
  27.    {
  28.      //
  29.      printf ("Nie można otworzyć pliku w celu dokonania zapisu!\n");
  30.      exit(1);
  31.    }
  32.    
  33.    //wpisanie tekstu do pliku
  34.    fprintf (fp, "%s", zapis);
  35.    fclose (fp);
  36.    //Ponowne otwarcie pliku w cely odczytania danych
  37.    if ((fp=fopen("nowyplik.txt", "r"))==NULL)
  38.    {
  39.      printf ("Nie można otworzyć pliku w celu dokonania zapisu!\n");
  40.      exit(1);
  41.    }
  42.    
  43.    //Pobranie znaków do tablicy odczyt z pliku
  44.    fgets(odczyt,100,fp);
  45.    
  46.    //wyświetlenie pobranych danych
  47.    printf("%s", odczyt);
  48.    
  49.    //zamknięcie pliku
  50.    fclose(fp);
  51.    return 0;
  52. }

Poniżej lekko zmodyfikowany program pozwalający na wyświetlanie rozmiaru pliku po wczytaniu z niego danych.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main ()
  4. {
  5.    //Definicja identyfikatora do pliku
  6.    FILE *fp;
  7.    fpos_t rozmiar;
  8.    //Definicja wymaganych zmiennych
  9.    char zapis[100];
  10.    char odczyt[100];
  11.    int i = 0;
  12.    printf("Wprowadz dane do pliku");
  13.    //Wczytanie danych z pliku
  14.    while(scanf("%c", &zapis[i]) == 1)
  15.    {
  16.        if(zapis[i]=='\n')
  17.        {
  18.            break;
  19.        }
  20.        ++i;
  21.    }
  22.    //Otwarcie bądź stworzenie pliku,
  23.    //z parametrem w czyli zapis
  24.    if ((fp=fopen("nowyplik.txt", "w"))==NULL)
  25.    {
  26.      //
  27.      printf ("Nie można otworzyć pliku w celu dokonania zapisu!\n");
  28.      exit(1);
  29.    }
  30.    //wpisanie tekstu do pliku
  31.    fprintf (fp, "%s", zapis);
  32.    fclose (fp);
  33.    //Ponowne otwarcie pliku w cely odczytania danych
  34.    if ((fp=fopen("nowyplik.txt", "r"))==NULL)
  35.    {
  36.      printf ("Nie można otworzyć pliku w celu dokonania zapisu!\n");
  37.      exit(1);
  38.    }
  39.    //Pobranie znaków do tablicy odczyt z pliku
  40.    fgets(odczyt,100,fp);
  41.    //wyświetlenie pobranych danych
  42.    printf("%s", odczyt);
  43.    //znalezienie konca pliku
  44.    fseek (fp, 0, SEEK_END);
  45.    //Umieszczenie aktualnej pozycji wskaznika w zmiennej rozmiar
  46.    fgetpos (fp, &rozmiar);
  47.    //Wyswietlenie rozmiaru pliku w bajtach
  48.    printf ("Rozmiar pliku: %d\n", rozmiar);
  49.    //zamknięcie pliku
  50.    fclose(fp);
  51.    return 0;
  52. }

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.