krzaczki w listach c++

Odpowiedz Nowy wątek
2014-12-31 01:18
0

Witam męczę się od 4 godzin z programem mam zrobić projekt na studia system oceniający filmy filmy mają być wczytywane z pliku txt i tytuł reżyser max 3 aktorów 10 ostatnich ocen itp

próbuje wczytać plik do listy ale jak uruchamia się while(!plik.eof()) to pętla leci w nieskończoność a jak ręcznie skopiuje kod 3 razy tle ile na razie mam informacji to pierwszy się dobrze wypiszę a reszta krzaczki oto kod pierwsza partia informacji się wpisuję a jak skopiuje zawartość while 3 razy lub 2 a while za komentuje to wychodzą krzaczki Prosił bym o pomoc .

oto txt

Skazani na Shawshank
Frank Darabont
1994
USA
Tim Robbins
Morgan Freeman
brak
10 2 5 6 7 4 8 4 3 6
3.5
Ojciec chrzestny
Francis Ford Coppola
1972
USA
Marlon Brando
Al Pacino
James Caan
6 2 6 7 4 6 8 3 7 3
6.5
Lot nad kukułczym gniazdem
Miloš Forman
1975
USA
Jack Nicholson
Louise Fletcher
William Redfield
4 6 8 4 6 8 5 3 5 7
7.4

 #include<iostream>
#include<string>
#include<fstream>
#include<sstream>
 
using namespace std;
 
 struct el_list{
     string tytul;
     string rezyser;
     string rok;
     string wytwornia;
     string ak[3];
     int oceny[10];
     float srednia;
 
     el_list *next;
 };
 
void wczyt(el_list *head, el_list *nowy, el_list *temp){
 
    ifstream plik("baza.txt");
    if (plik){
    //while (!plik.eof()){
 
            nowy = new el_list;
 
            getline(plik, nowy->tytul);
            getline(plik, nowy->rezyser);
            getline(plik, nowy->rok);
            getline(plik, nowy->wytwornia);
            getline(plik, nowy->ak[0]);
            getline(plik, nowy->ak[1]);
            getline(plik, nowy->ak[2]);
 
            plik >> nowy->oceny[0];
            plik >> nowy->oceny[1];
            plik >> nowy->oceny[2];
            plik >> nowy->oceny[3];
            plik >> nowy->oceny[4];
            plik >> nowy->oceny[5];
            plik >> nowy->oceny[6];
            plik >> nowy->oceny[7];
            plik >> nowy->oceny[8];
            plik >> nowy->oceny[9];
            plik >> nowy->srednia;
 
            temp->next = nowy;
            temp = temp->next;
 
    //}
            nowy->next = NULL;
            plik.close();
 
    }
 
    else{
        cout << "nie udało się otworzyć pliku" << endl;
        nowy->next = NULL;
 
    }
 
}
void wyswietl(el_list * head, el_list *nowy, el_list *temp){
 
    temp = head->next;
 
    while (temp != NULL)
    {
 
        cout << temp->tytul << endl;
        cout << temp->rezyser << endl;
        cout << temp->rok << endl;
        cout << temp->wytwornia << endl;
        cout << temp->ak[0] << endl;
        cout << temp->ak[1] << endl;
        cout << temp->ak[2] << endl;
        cout << temp->oceny[0] << endl;
        cout << temp->oceny[1] << endl;
        cout << temp->oceny[2] << endl;
        cout << temp->oceny[3] << endl;
        cout << temp->oceny[4] << endl;
        cout << temp->oceny[5] << endl;
        cout << temp->oceny[6] << endl;
        cout << temp->oceny[7] << endl;
        cout << temp->oceny[8] << endl;
        cout << temp->oceny[9] << endl;
        cout << temp->srednia << endl;
 
        temp = temp->next;
    }
 
}
 
 int main(){
     el_list *nowy;
     el_list *temp;
     el_list *head;
 
     nowy = new el_list;
 
     temp = nowy;
     head = nowy;
 
    wczyt(head, nowy, temp);
 
    wyswietl(head, nowy, temp);
 
     system("pause");
     return 0;
 }
edytowany 1x, ostatnio: SeBB12, 2014-12-31 01:20

Pozostało 580 znaków

2014-12-31 01:28
2
  1. plik.eof() stanie się prawdą dopiero po wczytaniu które się nie powiedzie, więc:
    while(true) { file>>value; if(!file) break; proceed(value); }
  2. Podziel funkcjonalność:
    struct Film { string tytul,rezyser,rok,wytwornia,ak[3]; int oceny[10]; }; // średnią liczymy na zawołanie
    struct Node { Film film; Node *next; };
    struct List { Node *head,*tail; };
    List L={0,0};
    wczyt(&L);
    wyswietl(&L);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-31 09:39
0

mógł bym prosić o małe wyjaśnienie bo słabo ogarniam listy szukałem w necie poradników itp ale szkół jest sporo każdy inaczej + większość już obiektowo a program ma być strukturalny

Pozostało 580 znaków

2014-12-31 09:46

temp = temp->next; to nie zmienia wartości zmiennej, bo nie przekazujesz jej przez referencję.


Pozostało 580 znaków

2014-12-31 11:45
0

gdzie mam przekazać ją jako referencję do funkcji wczyt() ?

Pozostało 580 znaków

2014-12-31 14:06
0

Zmieniłem kod na taki dodaje teraz 2 pierwsze dobrze ale znowu w while leci w nieskończoność a jak dam for żeby się wykonało 3 razy bo informacji w pliku jest na 3 razy to pierwszy ok wpisuje drugi też a 3 powtarza to co w drugim czyli wychodzi mi wynik + w następnym już oceny są z pierwszego wszędzie i brak jednej linijki

Skazani na Shawshank
Frank Darabont
1994
USA
Tim Robbins
Morgan Freeman
brak
10
2
5
6
7
4
8
4
3
6

Ojciec chrzestny
Francis Ford Coppola
1972
USA
Marlon Brando
Al Pacino
10
2
5
6
7
4
8
4
3
6

Ojciec chrzestny
Francis Ford Coppola
1972
USA
Marlon Brando
Al Pacino
10
2
5
6
7
4
8
4
3
6
Press any key to continue . . .

czemu powiela 2 zamiast wpisywać 3 zestaw ?

#include<iostream>
#include<string>
#include<fstream>
#include<sstream>
#include<conio.h>
 
using namespace std;
 
 struct el_list{
 
     string tytul;
     string rezyser;
     string rok;
     string wytwornia;
     string ak[3];
     int oceny[10];
 
     el_list *next;
 };
 
 bool pusta(el_list *head){
     if (head == NULL){
         return true;
     }
     else
         return false;
 }
 
 void wczytpierw(el_list *&head, el_list *&last,string tytul,string rezyser,string rok,string wytwornia,string ak[],int oceny[])
 {
        el_list *tmp = new el_list;
 
        tmp->tytul = tytul;
        tmp->rezyser = rezyser;
        tmp->rok = rok;
        tmp->wytwornia = wytwornia;
        tmp->ak[0] = ak[0];
        tmp->ak[1] = ak[1];
        tmp->ak[2] = ak[2];
 
        tmp->oceny[0] = oceny[0];
        tmp->oceny[1] = oceny[1];
        tmp->oceny[2] = oceny[2];
        tmp->oceny[3] = oceny[3];
        tmp->oceny[4] = oceny[4];
        tmp->oceny[5] = oceny[5];
        tmp->oceny[6] = oceny[6];
        tmp->oceny[7] = oceny[7];
        tmp->oceny[8] = oceny[8];
        tmp->oceny[9] = oceny[9];
 
        tmp->next = NULL;
        head = tmp;
        last = tmp;
 
 }
 
 void wczyt(el_list *&head, el_list *&last, string tytul, string rezyser, string rok, string wytwornia, string ak[], int oceny[])
 {
 
    if (pusta(head)){
        wczytpierw(head, last, tytul, rezyser, rok, wytwornia, ak, oceny);
    }
 
            else{
 
                el_list *tmp = new el_list;
 
                tmp->tytul = tytul ;
                tmp->rezyser=rezyser;
                tmp->rok=rok;
                tmp->wytwornia=wytwornia;
                tmp->ak[0] = ak[0];
                tmp->ak[1] = ak[1];
                tmp->ak[2] = ak[2];
 
                tmp->oceny[0] = oceny[0];
                tmp->oceny[1] = oceny[1];
                tmp->oceny[2] = oceny[2];
                tmp->oceny[3] = oceny[3];
                tmp->oceny[4] = oceny[4];
                tmp->oceny[5] = oceny[5];
                tmp->oceny[6] = oceny[6];
                tmp->oceny[7] = oceny[7];
                tmp->oceny[8] = oceny[8];
                tmp->oceny[9] = oceny[9];
 
                tmp->next = NULL;
                last->next = tmp;
                last = tmp;
 
            }
 
        }
 
void wyswietl(el_list *& temp){
 
    while (temp != NULL)
    {
 
        cout << temp->tytul << endl;
        cout << temp->rezyser << endl;
        cout << temp->rok << endl;
        cout << temp->wytwornia << endl;
        cout << temp->ak[0] << endl;
        cout << temp->ak[1] << endl;
        cout << temp->ak[2] << endl;
        cout << temp->oceny[0] << endl;
        cout << temp->oceny[1] << endl;
        cout << temp->oceny[2] << endl;
        cout << temp->oceny[3] << endl;
        cout << temp->oceny[4] << endl;
        cout << temp->oceny[5] << endl;
        cout << temp->oceny[6] << endl;
        cout << temp->oceny[7] << endl;
        cout << temp->oceny[8] << endl;
        cout << temp->oceny[9] << endl;
 
        temp = temp->next;
    }
 
}
 
int main(){
 
    el_list *head = NULL;
    el_list *last = NULL;
    string tytul;
    string rezyser;
    string rok;
    string wytwornia;
    string ak[3];
    int oceny[10];
 
    ifstream plik("baza.txt");
    if (plik){
        for (int i = 0; i < 3;i++){
 
        getline(plik, tytul);
        getline(plik, rezyser);
        getline(plik, rok);
        getline(plik, wytwornia);
        getline(plik, ak[0]);
        getline(plik, ak[1]);
        getline(plik, ak[2]);
        plik >> oceny[0];
        plik >> oceny[1];
        plik >> oceny[2];
        plik >> oceny[3];
        plik >> oceny[4];
        plik >> oceny[5];
        plik >> oceny[6];
        plik >> oceny[7];
        plik >> oceny[8];
        plik >> oceny[9];
 
        wczyt(head, last, tytul, rezyser, rok, wytwornia, ak, oceny);
 
        }
}
else{
    cout << "nie udalo sie otworzyc pliku" << endl;
}
 
     wyswietl(head);
 
     system("pause");
     return 0;
 }
 
edytowany 2x, ostatnio: SeBB12, 2014-12-31 14:10

Pozostało 580 znaków

2014-12-31 14:45
0

zauważyłem że jak dam przy wczytywaniu po ostatniej ocenie[9]
plik >> s;
i w pliku zrobię enter po każdym zestawie znaków
to wszystko się wypisuje już dobrze oprócz tułów bo mają pourywane kawałki nazw

Pozostało 580 znaków

2014-12-31 15:17
0

wyczytałem że muszę użyć cin.ignore('\n'); bo zostaje mi znak końca linni ale nie wiem gdzie to wstawić bo jak stawiam na początku to nic się nie wyswiatla

Pozostało 580 znaków

2014-12-31 15:30
0

rozwiązałem problem użyłem
plik.ignore();

i działa

Pozostało 580 znaków

2014-12-31 15:47
0

Wstawiam działający krótszy kod bez zbędnych zmiennych może ktoś w przyszłości będzie miał podobny przypadek

#include<iostream>
#include<string>
#include<fstream>
#include<sstream>
#include<conio.h>
 
using namespace std;
 
 struct el_list{
 
     string tytul;
     string rezyser;
     string rok;
     string wytwornia;
     string ak[3];
     int oceny[10];
 
     el_list *next;
 };
 
 bool pusta(el_list *head){
     if (head == NULL){
         return true;
     }
     else
         return false;
 }
 
 void wczyt(el_list *&head, el_list *&last)
 {
     ifstream plik("baza.txt");
     if (plik){
         for (int i = 0; i < 3; i++){
 
             if (pusta(head)){
 
                 el_list *tmp = new el_list;
 
                 getline(plik, tmp->tytul);
                 getline(plik, tmp->rezyser);
                 getline(plik, tmp->rok);
                 getline(plik, tmp->wytwornia);
                 getline(plik, tmp->ak[0]);
                 getline(plik, tmp->ak[1]);
                 getline(plik, tmp->ak[2]);
 
                 plik >> tmp->oceny[0];
                 plik >> tmp->oceny[1];
                 plik >> tmp->oceny[2];
                 plik >> tmp->oceny[3];
                 plik >> tmp->oceny[4];
                 plik >> tmp->oceny[5];
                 plik >> tmp->oceny[6];
                 plik >> tmp->oceny[7];
                 plik >> tmp->oceny[8];
                 plik >> tmp->oceny[9];
                 plik.ignore();
 
                 tmp->next = NULL;
                 head = tmp;
                 last = tmp;
             }
             else{
 
                 el_list *tmp = new el_list;
 
                 getline(plik, tmp->tytul);
                 getline(plik, tmp->rezyser);
                 getline(plik, tmp->rok);
                 getline(plik, tmp->wytwornia);
                 getline(plik, tmp->ak[0]);
                 getline(plik, tmp->ak[1]);
                 getline(plik, tmp->ak[2]);
 
                 plik >> tmp->oceny[0];
                 plik >> tmp->oceny[1];
                 plik >> tmp->oceny[2];
                 plik >> tmp->oceny[3];
                 plik >> tmp->oceny[4];
                 plik >> tmp->oceny[5];
                 plik >> tmp->oceny[6];
                 plik >> tmp->oceny[7];
                 plik >> tmp->oceny[8];
                 plik >> tmp->oceny[9];
                 plik.ignore();
 
                 tmp->next = NULL;
                 last->next = tmp;
                 last = tmp;
 
             }
         }
     }
     else{
         cout << "nie udalo sie otworzyc pliku" << endl;
     }
 
 }
 
void wyswietl(el_list * temp){
 
    while (temp != NULL)
    {
 
        cout << temp->tytul <<" ";
        cout << temp->rezyser << " ";
        cout << temp->rok << " ";
        cout << temp->wytwornia << " ";
        cout << temp->ak[0] << " ";
        cout << temp->ak[1] << " ";
        cout << temp->ak[2] << " ";
        cout << temp->oceny[0] << " ";
        cout << temp->oceny[1] << " ";
        cout << temp->oceny[2] << " ";
        cout << temp->oceny[3] << " ";
        cout << temp->oceny[4] << " ";
        cout << temp->oceny[5] << " ";
        cout << temp->oceny[6] << " ";
        cout << temp->oceny[7] << " ";
        cout << temp->oceny[8] << " ";
        cout << temp->oceny[9] << " ";
        cout << endl;
 
        temp = temp->next;
    }
 
}
 
int main(){
 
    el_list *head = NULL;
    el_list *last = NULL;
 
        wczyt(head, last);
 
wyswietl(head);
 
     system("pause");
     return 0;
 }
 
Na litość boską, edytuj swoje posty. + to aż się prosi o OOP. - Patryk27 2014-12-31 16:20

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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