Jak przetwarzać dane z pliku bez tablic

Problemy i ich rozwiązania w C++.
programer
Nowicjusz
Posty: 3
Dołączył(a): środa, 26 stycznia 2011, 21:33

Jak przetwarzać dane z pliku bez tablic

Post przez programer »

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
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Zapis do pliku

Post przez Morfidon »

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;    
}
Skorzystaj z listy dwukierunkowej, do której wklejam Ci kod lub vector'ów.

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.
programer
Nowicjusz
Posty: 3
Dołączył(a): środa, 26 stycznia 2011, 21:33

Jak przetwarzać dane z pliku bez tablic

Post przez programer »

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?
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Jak przetwarzać dane z pliku bez tablic

Post przez Morfidon »

programer 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?
Lekcja 15 - walidacja danych
programer
Nowicjusz
Posty: 3
Dołączył(a): środa, 26 stycznia 2011, 21:33

Re: Jak przetwarzać dane z pliku bez tablic

Post przez programer »

Thanks for help.
Post Reply