[C] Odczytywanie listy dwukierunkowej z pliku

Można powiedzieć, że odczytywanie listy dwukierunkowej z pliku jest podobną czynnością do zapisywania, gdyż wszystkie elementy listy musimy odczytywać w takiej samej kolejności jak zapisywaliśmy. Operacja ta jest bardzo przydatna i często wykorzystywana podczas pisania prostych baz danych. Struktura, na której będziemy bazować wygląda następująco:

//Struktura z danymi studenta
typedef struct DANE
{
	char* imie;
	char* nazwisko;
}Dane;

//Struktura z listą dwukierunkową
typedef struct STUDENT Student;
struct STUDENT
{
	Dane dane;
	Student* next;
	Student* prev;
};     

Pierwsza struktura składa się z pola imie oraz nazwisko, które są łańcuchami znaków. Natomiast struktura reprezentująca listę posiada pole z danymi ucznia, pole next(następny), które odnosi się do następnego elementu oraz pole prev(poprzedni), który odnosi się do poprzedniego elementu.

void odczyt_z_pliku(Student **head){
	FILE *wczytaj = NULL;
	char nazwa_pliku[] = "lista_studentow.txt";
	char bufor[30 + 1];
	Student *tmp, *pom;

	wczytaj = fopen(nazwa_pliku, "r");
	if (wczytaj == NULL)
		printf("Blad otwarcia pliku");
	else
	{
		while (fscanf(wczytaj, "%s", bufor) != EOF)
		{
			//alokowanie pamieci na nowy element
			tmp = (Student*)malloc(sizeof(Student));
			tmp->next = NULL;
			tmp->prev = NULL;
			//wczytywanie imienia
			tmp->dane.imie = (char*)malloc(sizeof(char)* (strlen(bufor) + 1));
			strcpy(tmp->dane.imie, bufor);
			//wczytywanie nazwiska
			fscanf(wczytaj, "%s", bufor);
			tmp->dane.nazwisko = (char*)malloc(sizeof(char)* (strlen(bufor) + 1));
			strcpy(tmp->dane.nazwisko, bufor);

			if (*head == NULL)
				*head = tmp;
			else
			{
				pom = *head;
				while (pom->next != NULL)
					pom = pom->next;
				tmp->prev = pom;
				pom->next = tmp;
			}
		}
		printf("Plik zostal wczytany");
	}
	fclose(wczytaj);
}

Komentarze

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *