Stos problem z elementami z pliku

0

Otóż piszę program stos, czyli listę jednokierunkową i mam problem przy wprowadzaniu elementów stosu z pliku tekstowego gdyż jeżeli potem w programie wybiorę opcję dodaj do stosu to elementy nie dodają się pojedynczo jeden po drugim tylko od razu wszystkie wczytywane są razem... nie wiem jak naprawić ten błąd...

wstawiam funkcję odpowiedzialną za wczytywanie elementów do stosu z pliku może ktoś będzie w stanie mi pomóc

  void DodajDoStosuu(char BUF[])  // dodawanie elementow z okreslonego pliku //
   { 
    int dl_nap_uz=0;
    nrw=0;
    we  = fopen("stos.txt", "rt");
    do  // zliczanie wierszy w pliku
    { 
    nrw++;
    fgets(BUF,80,we);
    } while(!feof(we));   
    fclose(we); 
     we  = fopen("stos.txt", "rt");
     int i;
     for(i=0;i<nrw;i++)
     {
     fgets(BUF,20,we);
     p=Wierzch; 
     Wierzch=new TStos;
     strcpy(Wierzch->text,BUF);
     Wierzch->poprzedni=p; nStosu++; }fclose(we);
   }

Oprócz wprowadzania elementów z pliku mam jeszcze problem z funkcją POKAZ STOS która ma działać na zasadzie, że dodajemy sobie kolejno elementy do stosu i powiedzmy jest ich już bardzo dużo i chcemy zobaczyć co było na początku i wtedy wybieramy opcję POKAZ STOS i przesuwamy się do jego początku...
tylko nie wiem jak to zrobić gdyż nie wiem jak z powrotem wyświetlić początek stosu ???

0
  1. Załącz plik.
  2. Czy dobrze zlicza ci linie?

wydaje mi się że może plik zapisany jest w formacie gdzie koniec lini jest niepoprawnie interpretowany przez fgets. Dużo edytorów tekstu ma taka opcje.

0

plik zapisany jest w formacie txt ale właśnie zauważyłem dziwną prawidłowość a mianowicie że jak wezmę dodaj do stosu to wyświetla się nie więcej niż 5 nowych elementów i chyba w tym tkwi problem...

0

Bez pliku nic nie zrobię. Muszę mieć te same dane co ty.

0

i jeszcze wrzuć definicję klasy TStos.

0

ok już wrzucam mam nadzieję że uda ci się rozwikłać moją strukturę

//          STRUKTURA STOS         STRUKTURA STOS         STRUKTURA STOS         STRUKTURA STOS         STRUKTURA STOS   //
struct TStos { char text[21]; TStos *poprzedni; };   // wskaznik do danego elementu stosu czyli do jakiegos napisu // elementy stosu poprzednik
TStos *Wierzch, *p;   // wskaznik do wierzchołka stosu i do elementu poprzedniego

FILE  *we; char NP[81]="stos.txt";  // zmienne do otwierania pliku z którego będą pochodziły elementy stosu
int  zPliku, n, nrw, nStosu,   zn=0;
char BUF[21];
//   Funkcje dodajace do stosu kolejne elementy     // 
   void DodajDoStosu(char BUF[])         // dodawanie elementow poprzez wprowadzanie ich z klawiatury przez urzytkownika
   { 
     int dl_nap_uz=0;
     do
     {  
     MessWin(4,1,4,80,6,0);        
     at(4,1); printf("podaj element do stosu: ");     
     gets(BUF);
     dl_nap_uz=strlen(BUF);
     } while(dl_nap_uz>20);
     
     p=Wierzch; 
     Wierzch=new TStos;
     strcpy(Wierzch->text,BUF);
     Wierzch->poprzedni=p; nStosu++;
    } 
     
   void DodajDoStosuu(char BUF[])  // dodawanie elementow z okreslonego pliku //
   { 
    int dl_nap_uz=0;
    nrw=0;
    we  = fopen("stos.dat", "rt");
    do  // zliczanie wierszy w pliku
    { 
    nrw++;
    fgets(BUF,20,we);
    } while(!feof(we));   
    fclose(we); 
     we  = fopen("stos.dat", "rt");
     int i;
     for(i=0;i<nrw;i++)
     {
     fgets(BUF,20,we);
     p=Wierzch; 
     Wierzch=new TStos;
     strcpy(Wierzch->text,BUF);
     Wierzch->poprzedni=p; nStosu++; }fclose(we);
   } 
//  Pasek statusu na dole ekranu na ktorym znajduje sie liczba nalozonych na stos elementow   //
   void Status(int nStosu)
   { 
    at(24,1);textattr(16*GREEN+WHITE);printf("Liczba elementow polozonych na stos                          |  ESC - wyjscie   ");textattr(16*GREEN+RED);at(24,38); printf("%d",nStosu);              
    if(nStosu>18)
    {
      at(24,41);textattr(16*GREEN+YELLOW);putchar(25); printf(" przewin stos w dol"); 
    }
    textattr(16*GREEN+WHITE);
    at(25,1);delline(); at(24,1);insline();MessWin(24,1,24,80,5,0); 
   } 
 //  Funkcja wyswietlajaca stos na ekranie //
   void PokazStos() // dla elementów wprowadzanych z klawiatury 
   { 
   if(Wierzch==NULL) 
   {MessWin(4,1,4,80,6,0); at(4,1); printf("           STOS PUSTY!          "); return; }
   else 
   {MessWin(4,1,4,80,5,0); p=Wierzch; int nrw=6; MessWin(nrw,1,nrw,80,5,0);
   
   while(p!=NULL)
   { if(nrw>23)
   {/* cos trzeba wstawic do wyswietlania stosu od poczatku z pliku*/; return; }
   at(nrw,28); textattr(16*LIGHTBLUE+WHITE); printf("%5d: ",nStosu-nrw+6); printf(p->text);printf("                ");
   p=p->poprzedni; nrw++; at(25,80); } // while
   Status(nStosu);    
   }
   
   }
    //  Funkcja wyswietlajaca stos na ekranie //
   void PokazStosp()   // dla elementów wprowadzanych z pliku
   { 
   int i=1;
   if(Wierzch==NULL) 
   {MessWin(4,1,4,80,6,0); at(4,1); printf("           STOS PUSTY!          "); return; }
   else 
   {MessWin(4,1,4,80,5,0); p=Wierzch; int nrw=6; MessWin(nrw,1,nrw,80,5,0);
   while(p!=NULL)
   { if(nrw>23)
   {/* cos trzeba wstawic do wyswietlania stosu od poczatku z pliku*/; return; }
   
   for(i=0;i<1;i++)at(nrw,28); textattr(16*LIGHTBLUE+WHITE); printf("%5d: ",nStosu-nrw+6);i++; printf(p->text);printf("                ");
   p=p->poprzedni; nrw++;  at(25,80);Status(nStosu); } // while
   
   }
   
   }
   
// Usuwanie elementow stosu pojedynczo poprzez usuwanie wierzcholka stosu
   void ZdejmijZeStosu()
   { p=Wierzch;
     if (Wierzch!=NULL) { Wierzch=p->poprzedni; nStosu--; delete p; } } 
// Usuwanie wszystkich elementow stosu // Czyszczenie Stosu //   
   void WyczyscStos()
   { p=Wierzch;
     while(Wierzch!=NULL)	{ Wierzch=p->poprzedni;  p=Wierzch; nStosu--; delete p;}
   } 
0

plik którym się posługuję to przykładowo:

aaa
cc
sas
sa
vvv
sdas
adsasd
asd
asd
asd
asd
as
das
d
as
da
sd
asd
as
das
d
as
das
d
asd
as
d
asd
as
d
asd
as
das
adsadasdas
d
asd
as
d
as
d

0

Twoje funkcja poprawnie tworzy stos. Spokojnie wyświetliłem elementy z mojego pliku. Coś masz nie tak z przeglądaniem stosu. Spróbuj tak jak poniżej.

 void PokazStosp()   // dla elementów wprowadzanych z pliku
   {
    TStos* top = Wierzch;
    
    while (top)
    {
        //wyświetl text
        top = top->poprzedni ;
    }
   }  
0

spróbowałem zmienić ten warunek w while ale i tak nie działa to jak powinno... bo powinno być tak że przy dodawaniu nowego elementu wcześniejszy się przesuwa na dół a jego miejsce zajmuje nowo wprowadzany. A w tym przypadku tak jak napisałem te elementy są wpisywane tak jakby od końca... i w dodatku wszystkie na raz w związku z czym nie działa nawet opcja USUN ZE STOSU :(

0

Mówie Ci że u mnie działa :).

Zrobiłem plik TXT zapisałem jako ANSI. Algorytm jest ok. Zrób debug a zobaczysz.

0

Ok to co zmieniłem to na wejściu DodajDoStosu() dałem zmieną char BUF[1000].

0

Jesli chodzi ci tylko o odwzorowanie kolejności z pliku to za pomocą Stosu tego nie zrobisz. Stos działa tak że możesz go przeszukiwać tylko od wierzchołka. Jakbyś chciał przeszukiwać od pierwszego elementu do wierzchołka to już nie jest Stos tylko lista.

0

ok no u mnie to nie za bardzo jednak działa wpisałem taką samą zmienią do funkcji DodajDoStosu ale to nie za wiele pomogło...

Mam pytanie co masz na myśli że dobrze to działa... ?

Wiem że stos tworzony jest ok ale jest właśnie problem z tym wyświetleniem bo nadal wyświetla mi cały plik na raz a chciałbym żeby było tak że kolejne wiersze pojawiają się dopiero po naciśnięciu DODAJ DO STOSU...

zdejmowanie ze stosu też niby działa ok ale tylko powiedzmy że w 50% gdyż nie ma być zdejmowany ostatni element pliku a ostatni element jaki wyświetliliśmy na ekranie....

już naprawdę nie mam pojęcia jak to zrobić...

0

javauser a mógłbyś zamieścić ten swój zmieniony kod ??? chciałbym zobaczyć co u siebie robię źle przy tym wpisywaniu i wypisywaniu z pliku....

0

Mam pytanie dowiedziałem się że to przesuwanie elementów stosu w konsoli można zrobić za pomocą WinApi a dokładniej funkcji takiej jak np: ScrollConsoleScreenBuffer

niestety nie bardzo się orientuję w WinApi mógłby ktoś mi pomóc z obsługą tej biblioteki ???
Jak się wczytuje do tych funkcji tekst i jak go potem przesuwać ???

1 użytkowników online, w tym zalogowanych: 0, gości: 1