Dobry Wieczór.
Zrobiłem część programu w języku c++ (DevC++) pt. Dziennik lekcji. ale dowiedziałem się że nie mogę przetwarzać danych z pliku na tablicach.
Jak mam zmienić zmienić kod programu aby wszystkie jego nadal działały (dodawanie, usuwanie osób itd.) bez użycia tablicy (dane[50]).
Kod programu w załączniku.
Dziękuje za wszelkie próby pomocy.
Zmieniam temat
Jak przetwarzać dane z pliku bez tablic
Re: Zapis do pliku
Code: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct DaneOsobowe //struktura posiadajaca cechy imie, nazwisko i wiek
{
char imie[20];
char nazwisko[20];
unsigned short wiek;
};
struct Lista //lista dwukierunkowa
{
struct Lista *pop;
struct Lista *nas;
DaneOsobowe dane;
};
struct DaneOsobowe Wczytaj(); //pomocnicza funkcja wczytujaca dane
struct Lista* Dodaj(struct Lista* currentL, unsigned int *il, bool mod, struct DaneOsobowe os); //funkcja dodajaca nowy element do konca listy
void wyswietlOdPoczatku(struct Lista* currentL, unsigned int *il); //funkcja wyswietlajaca wszystkie elementy listy od poczatku
struct Lista* kasujListe(struct Lista* currentL, unsigned int *il); //funkcja kasujaca cala liste
void zapisDoPliku(struct Lista *toWrite, unsigned int *il); //funkcja zapisujaca liste do pliku
struct Lista* wczytajZPliku(struct Lista *toLoad, unsigned int *il);//funckja wczytujaca dane z pliku
int main()
{
unsigned int ilOsob = 0; //stan bazy danych
char t; //zmienna pomocnicza do menu
Lista *listaBiezaca = NULL; //biezacy element Listy
//START MENU
do{
//MENU
printf("Ilosc wpisow: %d\n", ilOsob);
printf("1 - Dodaj\n");
printf("2 - Wyswietl wszystkich od poczatku \n");
printf("3 - Zapis do Pliku \n");
printf("4 - Wczytaj z Pliku \n");
printf("5 - Kasuj Liste \n");
printf("ESC - KONIEC\n");
switch (t)
{
case '1': listaBiezaca = Dodaj(listaBiezaca, &ilOsob, 0, Wczytaj());
break;
case '2': wyswietlOdPoczatku(listaBiezaca, &ilOsob);
break;
case '3': zapisDoPliku(listaBiezaca, &ilOsob);
break;
case '4': listaBiezaca = wczytajZPliku(listaBiezaca, &ilOsob);
break;
case '5': listaBiezaca = kasujListe(listaBiezaca, &ilOsob);
break;
}
t=getch();
system("cls");
} while( t != 27);
system("pause");
return 0;
}
struct DaneOsobowe Wczytaj()
{
struct DaneOsobowe os;
printf("Imie: ");
scanf("%s", os.imie);
printf("Nazwisko: ");
scanf("%s", os.nazwisko);
printf("Wiek: ");
scanf("%d", &os.wiek);
return os;
}
struct Lista* Dodaj(struct Lista* currentL, unsigned int *il, bool mod, struct DaneOsobowe os)
{
struct Lista * tmpNL = (struct Lista*)malloc(sizeof(struct Lista));
// nowa Lista która jest tymczasowa temporary New List
//zamiana danych miejscami
strcpy(tmpNL->dane.imie, os.imie);
strcpy(tmpNL->dane.nazwisko, os.nazwisko);
tmpNL->dane.wiek = os.wiek;
if (currentL == NULL) //JE?ELI JEST TO PIERWSZY ELEMENT LISTY
{
tmpNL->pop = NULL; //To nie ma poprzednika ani nastepnika
tmpNL->nas = NULL;
}
else //W innym wypadku jest to nowy element listy wiec trzeba go ustawic sprytnie na koncu listy ;)
{
currentL->nas = tmpNL;
tmpNL->pop = currentL;
tmpNL->nas = NULL;
}
if (!mod)
++*il;
return tmpNL;
}
void wyswietlOdPoczatku(struct Lista* currentL, unsigned int *il)
{
if (*il != 0) //jezeli ktos w bazie w ogole jest
{
unsigned int i = 0;
if (currentL != NULL) //jezeli ktokolwiek jest w tej liscie
while(currentL->pop != NULL) // to dopoki poprzednik nie jest pierwszym elementem
currentL = currentL->pop; //biezacy zmieniaj na poprzednika az bedzie pierwszy
while (currentL != NULL) //jezeli ktokolwiek jest w tej liscie to wypisz wszystkie elementy listy od poczatku
{
printf("%d. %s %s %d\n", ++i, currentL->dane.imie, currentL->dane.nazwisko, currentL->dane.wiek);
currentL = currentL->nas;
}
}
else
printf("Nie ma nikogo w bazie danych, nie ma kogo wyswietlic");
}
struct Lista* kasujListe(struct Lista* currentL, unsigned int *il)
{
if (*il != 0) //jezeli ktos w bazie w ogole jest
{
if (currentL != NULL)
while(currentL->pop != NULL)
currentL = currentL->pop;
struct Lista * tmp;
while (currentL != NULL)
{
tmp = currentL;
currentL = currentL->nas;
free(tmp);
}
*il = 0;
}
else
printf("Nie ma kogo kasowac, przykro mi innym razem ;)");
return currentL;
}
void zapisDoPliku(struct Lista *toWrite, unsigned int *il)
{
if (*il !=0)
{
FILE *file = fopen("dane.txt", "w"); //otwieramy plik do zapisu
fprintf(file, "%d\n", *il); //wpisujemy najpierw ilosc osob w bazie
if (toWrite != NULL) //znajdujemy pierwszy element listy
while(toWrite->pop != NULL)
toWrite = toWrite->pop;
for (int i = 0; i < *il; i++) //zapisujemy dane do pliku
{
fprintf(file, "%s\n", toWrite->dane.imie);
fprintf(file, "%s\n", toWrite->dane.nazwisko);
fprintf(file, "%d\n", toWrite->dane.wiek);
toWrite = toWrite->nas; //zmieniamy za ka?dym razem na kolejny element Listy
}
fclose(file);
}
else
printf("Nie ma jeszcze kogo zapisac, najpierw kogos dodaj!");
}
struct Lista* wczytajZPliku(struct Lista *toLoad, unsigned int *il)
{
if (toLoad != NULL) toLoad = kasujListe(toLoad, il); //jezeli juz mamy jakas liste to usunmy ja
FILE *file = fopen("dane.txt", "r"); //otwieramy plik do odczytu
if (file)
{
struct DaneOsobowe os;
fscanf(file, "%d", il); //wczytanie ilosci osob
for (int i = 0; i < *il; i++) //zapisujemy dane do pliku
{
fscanf(file, "%s", os.imie);
fscanf(file, "%s", os.nazwisko);
fscanf(file, "%d", &os.wiek);
toLoad = Dodaj(toLoad, il, 1, os);
}
fclose(file);
printf("Lista zostala wczytana wcisnij ENTER");
}
else
printf("Plik do wczytywania nie istnieje");
return toLoad;
}
Może być jeszcze tak, że nauczyciel chce, aby bezpośrednio pobierało dane z pliku bez wczytywania ich do jakiejkolwiek pamięci, wtedy jest bardzo dużo do zmienienia, ale to już trzeba się dopytać nauczyciela.
Jak przetwarzać dane z pliku bez tablic
Tablice odpadają. A więc zmieniam cały kod programu.
Dzięki za pomoc.
Mam jeszcze pytanie: czy jest jakaś funkcja która nie pozwalałaby wpisywać liter do int'a i powracała do wpisania tej wartości?
Dzięki za pomoc.
Mam jeszcze pytanie: czy jest jakaś funkcja która nie pozwalałaby wpisywać liter do int'a i powracała do wpisania tej wartości?
Re: Jak przetwarzać dane z pliku bez tablic
Lekcja 15 - walidacja danychprogramer napisał(a): Mam jeszcze pytanie: czy jest jakaś funkcja która nie pozwalałaby wpisywać liter do int'a i powracała do wpisania tej wartości?
Re: Jak przetwarzać dane z pliku bez tablic
Thanks for help.