inf‎ > ‎

lab8_przyklad

/*
(c) 2012 by Krzysztof Urbański
Można używać fragmentów poniższych kodów źródłowych - jest to wręcz zalecane :)
Kod należy kompilować za pomocą kompilatora C++ (lub wprowadzić niewielkie poprawki, aby dało się go skompilować w ANSI C).
Plik źródłowy powinien mieć więc rozszerzenie .cpp (np. main.cpp).
W kilku miejscach przyda się też dodanie zabezpieczeń np. sprawdzenie, czy powiodła się alokacja pamięci, czy powiodło się wczytanie/zapisywanie danych do pliku itp.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Student
{
  int nralb;
  char imie[100];
};


void ustaw_wartosci_poczatkowe(Student * ptr, int N)
{
for(int i = 0; i<N; i++)
{
ptr[i].nralb = 100000 + i + 1; 
sprintf(ptr[i].imie, "Imie <%d>", i + 1);
}
}


void wyswietl(Student *ptr, int N)
{
for(int i = 0; i<N; i++)
{
printf("%d %s\n", ptr[i].nralb, ptr[i].imie);
}
}


//zapisywanie do pliku jest bardzo podobne do wyświetlania w konsoli
//w kolejnych wierszach pliku są kolejne rekordy. Każde pole struktury Student jest zapisane w nowym wierszu.
//przykładowy plik z danymi:
/*
100001
Imie <1>
100002
Imie <2>
100003
Imie <3>
...
*/
void zapisz_do_pliku(Student *ptr, int N, char *nazwapliku)
{
FILE * f = fopen(nazwapliku, "w");
if(f == NULL) 
{
printf("problem z plikiem\n");
return;
}
for(int i = 0; i<N; i++)
{
fprintf(f, "%d\n%s\n", ptr[i].nralb, ptr[i].imie);
}
fclose(f);
}



void wczytaj_dane_z_pliku(Student *ptr, int N, char *nazwapliku)
{
FILE * f = fopen(nazwapliku, "r");
if(f == NULL) 
{
printf("problem z plikiem\n");
return;
}
for(int i = 0; i<N; i++)
{
//ważne! wymagany jest operator & 
fscanf(f, "%d\n", &ptr[i].nralb); 
//imie to tablica, więc jest to wskaźnik i nie potrzeba dodatkowo operatora &
fgets(ptr[i].imie, sizeof(ptr[i].imie), f); 
//poniższa instrukcja to sposób na pozbycie się znaku końca wiersza (\n) z napisu
if(ptr[i].imie[strlen(ptr[i].imie) - 1] == '\n') ptr[i].imie[strlen(ptr[i].imie) - 1] = '\0';
}
fclose(f);
}



void main()
{
//liczba rekordów w bazie; można tę wartość wczytać z klawiatury
int N = 10;

//wskaźnik do całej bazy danych w pamięci, początkowo pusty (NULL)
Student *ptr = NULL; 

//alokowanie pamięci na N rekordów (studentów), każdy z nich zajmuje w pamięci 'sizeof(Student)' bajtów.
ptr = (Student *) malloc(N * sizeof(Student)); 
//wpisz do bazy (w pamięci RAM) pewne wartości początkowe, można też wczytać je z klawiatury
ustaw_wartosci_poczatkowe(ptr, N); 
printf("Zawartosc bazy:\n");
//wyświetl zawartość bazy
wyswietl(ptr, N);
//zapisz dane z bazy do pliku tekstowego  c:\nazwa.txt (możesz użyć innej nazwy lub ścieżki)
zapisz_do_pliku(ptr, N, "c:\\nazwa.txt");

//zwolnij pamięć
free(ptr); 

//a teraz wczytamy przygotowane wyżej dane bezpośrednio z pliku tekstowego:
printf("\n\nA teraz dane wczytane z pliku:\n");
ptr = (Student *) malloc(N * sizeof(Student)); 
wczytaj_dane_z_pliku(ptr, N, "c:\\nazwa.txt");
wyswietl(ptr, N);
free(ptr); 


printf("\n\nKoniec\n\n");
}
Comments