Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Program crashuje się z niewiadomej przyczyny po skończeniu pętli

Ostatnio zmodyfikowano 2014-10-11 15:30
Autor Wiadomość
treekt
Temat założony przez niniejszego użytkownika
Program crashuje się z niewiadomej przyczyny po skończeniu pętli
» 2014-10-11 01:30:16
Napisałem program (wprawdzie jeszcze nie skonczony ale całe sedno już jest) któremu podajemy liczbe uczniów, następnie podajemy tyle uczniów z imienia i nazwiska ile zadeklarowaliśmy wcześniej liczbą.
Dane są zapisywane do pliku po czym program musimy wlaczyc od nowa.
Program ma za zadanie wyznaczać uczniów mających iść do kolejki z podanej listy, jeden po drugim.
Po ponownym włączeniu możemy rozpocząć nową kolejke.
Program wczytuje do tablicy wszystkie wiersze (uczniów) z pliku a potem rozpoczyna kolejke.
Generalnie każdy powinien zrozumieć po kodzie.

A więc w czym mam problem?
Nieciekawy "błąd" pojawia się pętli od linijki 55 do 60.
Dane z pliku są wpisywane do tablicy pięknie ładnie lecz gdy warunek eof zwróci true i pętla sie zakonczy program sie crashuje i zamyka. Dałem w pętli testowią wiadomość "test" i poza pętlą "test2" i w pętli test wyświetla sie natomiast już po pętli "test2" jest nie widoczne i następuje crash.

Proszę o wskazanie błędu i rozwiązanie go, nie rozumiem totalnie czemu sie tak dzieje, dopiero zaczynam programowanie w c++ wiec jestem laikiem.

Część gdzie jest problem:

string uczen[iUczniow]; // Deklaracja tablicy aby przypisac kazdy wiersz do osobnej tablicy
Plik.open("Uczniowie.txt", ios::in); // Zapisanie wierszy do tablic
for(int i = 0; !Plik.eof(); i++){
getline(Plik, uczen[i]);
cout<<"test";
}
cout<<"test2";
Plik.close();


Cały kod: http://pastebin.com/hKFgDAvi
P-118224
Monika90
» 2014-10-11 08:18:24
C/C++
for( int i = 0; !Plik.eof(); i++ ) {
    getline( Plik, uczen[ i ] );
    cout << "test";
}
W tej pętli zmienna i wychodzi poza dopuszczalny zakres tablicy. Użycie eof() w warunku pętli to na ogół głupi pomysł.

A tak przy okazji, możliwość deklaracji tablicy o rozmiarze określonym za pomocą zmiennej nie należy do standardowego C++, choć może za 3 lata już będzie w standardzie.
P-118229
treekt
Temat założony przez niniejszego użytkownika
» 2014-10-11 15:20:48
Okey to w takim razie co mam dać w tej pętli żeby wszystko było legit?
P-118256
stryku
» 2014-10-11 15:28:06
Jeżeli nie wiesz ile będzie w pliku linii to w vectorze możesz zrobić.
C/C++
std::vector < std::string > uczen;
char buf[ max_dl_linii ];
while( plik.getline( buf, max_dl_linii ) )
     uczen.push_back( std::string( buf ) );

P-118257
treekt
Temat założony przez niniejszego użytkownika
» 2014-10-11 15:30:05
Okey poradzilem sobie ;)

Zrobiłem w ten sposób ;)

for(int i = 0; i < iUczniow ; i++){
    getline(Plik, uczen[i]);
    cout<<"test";
}
P-118258
« 1 »
  Strona 1 z 1