Mat Temat założony przez niniejszego użytkownika |
Aplikacja została zatrzymana - modyfikowanie zawartości tablic pobranych z plików » 2015-07-21 17:01:20 Witam, z kursu korzystałem już wcześniej, a dziś postanowiłem się zarejestrować także na forum. Jest to moja pierwsza - i mam nadzieję, że nie ostatnia :) - wizyta tutaj. Przychodzę tu, niestety, z problemem. Mianowicie, postanowiłem zmierzyć się pierwszy raz w życiu z bazami danych. Napisałem w tym celu prostą aplikację, której kod prezentuję poniżej. Jednak, gdy próbuję usunąć dowolnego użytkownika z bazy, otrzymuję błąd krytyczny aplikacji. Co dla mnie niezrozumiałe, dzieje sie tak tylko, gdy dane nt. użytkowników pobierane są z plików. Gdy wprowadziłem je "ręcznie", problem zniknął. #include <iostream> #include <cstdio> #include <fstream> #include <stdio.h> #include <conio.h> #include <windows.h>
using namespace std;
void gotoxy( int column, int line ) { }
void clrscr() { }
void drawTabble()
}
int prawidlowa() {
}
int prawidlowaDowolna() { int liczba; bool czyUdana; do { cin.clear(); cin.sync(); cin >> liczba; czyUdana = cin.good(); if( czyUdana == 0 ) { cout << "Prosze podac prawidlowa liczbe." << endl; czyUdana = 0; } } while( czyUdana != 1 );
return liczba; }
int main() {
unsigned int wybor; unsigned int wskaznik; string bazaZerujaca[ 1 ]; string bazaImion[ 8 ]; string bazaNazwisk[ 8 ]; string bazaFunkcji[ 8 ];
bazaImion[ 0 ] = "Mateusz"; bazaNazwisk[ 0 ] = "Kowalski"; bazaFunkcji[ 0 ] = "Administrator";
bazaImion[ 1 ] = "Jakub"; bazaNazwisk[ 1 ] = "Nowak"; bazaFunkcji[ 1 ] = "Uzytkownik";
bazaImion[ 2 ] = "Wojciech"; bazaNazwisk[ 2 ] = "Kowal"; bazaFunkcji[ 2 ] = "Uzytkownik";
bazaImion[ 3 ] = "Arkady"; bazaNazwisk[ 3 ] = "Tomczuk"; bazaFunkcji[ 3 ] = "Uzytkownik";
int aktualnaIlosc = 4; do { cout << "Testowa baza danych - main menu" << endl << endl; cout << "1. Wyswietl baze." << endl; cout << "2. Dodaj osobe." << endl; cout << "3. Usun osobe." << endl; cout << "0. Wyjscie. \n\n\n\n\n\n" << endl; wybor = prawidlowa(); clrscr(); if( wybor == 1 ) { int counterColumn = 1; int counterArray = 0; drawTabble(); do { cout << counterColumn << "."; gotoxy( 3, counterColumn ); cout << bazaImion[ counterArray ]; gotoxy( 18, counterColumn ); cout << bazaNazwisk[ counterArray ]; gotoxy( 35, counterColumn ); cout << bazaFunkcji[ counterArray ] << endl; counterArray++; counterColumn++; } while( counterColumn <( aktualnaIlosc + 1 ) ); getch(); clrscr(); } else if( wybor == 2 ) { if( aktualnaIlosc >= 8 ) { cout << "Dotarto do aktualnego maksimum ilosci rekordow." << endl; getch(); clrscr(); } else { cout << "Imie:" << endl; cout << "Nazwisko:" << endl; cout << "Funkcja:" << endl; gotoxy( 11, 0 ); cin >> bazaImion[ aktualnaIlosc ]; ofstream wpisImion; wpisImion.open( "imiona.txt", ios::app ); wpisImion << "\n" << bazaImion[ aktualnaIlosc ]; gotoxy( 11, 1 ); cin >> bazaNazwisk[ aktualnaIlosc ]; ofstream wpisNazwisk; wpisNazwisk.open( "nazwiska.txt", ios::app ); wpisNazwisk << "\n" << bazaNazwisk[ aktualnaIlosc ]; gotoxy( 11, 2 ); cin >> bazaFunkcji[ aktualnaIlosc ]; ofstream wpisFunkcji; wpisFunkcji.open( "funkcje.txt", ios::app ); wpisFunkcji << "\n" << bazaFunkcji[ aktualnaIlosc ]; aktualnaIlosc++; clrscr(); } } else if( wybor == 3 ) { char pewnosc; cout << "Podaj numer ID uzytkownika, ktorego chcesz usunac." << endl; cout << "Numer: "; unsigned int removeUser; do { removeUser = prawidlowaDowolna(); if( removeUser > aktualnaIlosc || removeUser < 0 ) cout << "Podales niewlasciwe ID. Sprobuj ponownie. "; } while( removeUser > aktualnaIlosc || removeUser < 0 ); cout << endl << "Chcesz usunac uzytkownika " << bazaImion[ removeUser - 1 ] << " " << bazaNazwisk[ removeUser - 1 ] << "."; cout << endl << "Czy jestes tego pewien? (y/n) "; cin >> pewnosc; if( pewnosc == 'y' || pewnosc == 'Y' ) { int remover = removeUser; if( remover == aktualnaIlosc ) { bazaImion[ remover - 1 ] = bazaZerujaca[ 0 ]; bazaNazwisk[ remover - 1 ] = bazaZerujaca[ 0 ]; bazaFunkcji[ remover - 1 ] = bazaZerujaca[ 0 ]; aktualnaIlosc--; } else if( remover < aktualnaIlosc ) { do { bazaImion[ remover - 1 ] = bazaImion[ remover ]; bazaNazwisk[ remover - 1 ] = bazaNazwisk[ remover ]; bazaFunkcji[ remover - 1 ] = bazaFunkcji[ remover ]; remover++; } while( remover <= aktualnaIlosc ); aktualnaIlosc--; } } clrscr(); } } while( wybor != 0 );
return 0; }
Podejrzewam, że kod wygląda... źle. Aczkolwiek: co może powodować błędy? Analizowałem wiele scenariuszy i nie potrafię dostrzec tego "czegoś złego"... |
|
pekfos |
» 2015-07-21 17:07:42 unsigned int removeUser; do { removeUser = prawidlowaDowolna(); if( removeUser > aktualnaIlosc || removeUser < 0 ) cout << "Podales niewlasciwe ID. Sprobuj ponownie. "; } while( removeUser > aktualnaIlosc || removeUser < 0 );
cout << endl << "Chcesz usunac uzytkownika " << bazaImion[ removeUser - 1 ] << " " << bazaNazwisk[ removeUser - 1 ] << ".";
| removeUser nie może być ujemne, a dopuszczasz 0 i odejmujesz 1. //Pomijam na forum - nieistotny z punktu problemu fragment kodu |
Istotny, czy nie, kodu nie można już przetestować. Poza tym skąd pewność, że nie jest istotny..? Do tego zepsułeś formatowanie kodu zostawiając nawiasy nie od pary. |
|
Mat Temat założony przez niniejszego użytkownika |
» 2015-07-21 17:26:03 Pekfos, dziękuję za szybką odpowiedź. Teraz umieszczę cały kod - nie spodziewałem się, że ktoś może chcieć to testować... Poza tym, poprawiłem warunek do prawidłowego wpisu - teraz wartość minimalna wynosi 1. #include <iostream> #include <cstdio> #include <fstream> #include <stdio.h> #include <conio.h> #include <windows.h>
using namespace std;
void gotoxy( int column, int line ) { COORD coord; coord.X = column; coord.Y = line; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord ); }
void clrscr() { for( int i = 0; i < 50; i++ ) { cout << "\n"; } gotoxy( 0, 0 ); }
void drawTabble() { gotoxy( 0, 0 ); cout << "ID"; gotoxy( 3, 0 ); cout << "Imie"; gotoxy( 18, 0 ); cout << "Nazwisko"; gotoxy( 35, 0 ); cout << "Funkcja" << endl; }
int prawidlowa() { int liczba; int lineCounter = 12; bool czyUdana; do { cin.clear(); cin.sync(); cout << "Numer opcji: "; cin >> liczba; czyUdana = cin.good(); if( czyUdana == 0 || liczba < 0 || liczba > 3 ) { gotoxy( 26, lineCounter ); cout << "Prosze podac prawidlowa liczbe z zakresu od 0 do 3." << endl; czyUdana = 0; lineCounter++; } } while( czyUdana != 1 ); return liczba; }
int prawidlowaDowolna() { int liczba; bool czyUdana; do { cin.clear(); cin.sync(); cin >> liczba; czyUdana = cin.good(); if( czyUdana == 0 ) { cout << "Prosze podac prawidlowa liczbe." << endl; czyUdana = 0; } } while( czyUdana != 1 ); return liczba; }
int main() { unsigned int wybor; unsigned int wskaznik; string bazaZerujaca[ 1 ]; string bazaImion[ 8 ]; string bazaNazwisk[ 8 ]; string bazaFunkcji[ 8 ]; bazaImion[ 0 ] = "Mateusz"; bazaNazwisk[ 0 ] = "Kowalski"; bazaFunkcji[ 0 ] = "Administrator"; bazaImion[ 1 ] = "Jakub"; bazaNazwisk[ 1 ] = "Nowak"; bazaFunkcji[ 1 ] = "Uzytkownik"; bazaImion[ 2 ] = "Wojciech"; bazaNazwisk[ 2 ] = "Kowal"; bazaFunkcji[ 2 ] = "Uzytkownik"; bazaImion[ 3 ] = "Arkady"; bazaNazwisk[ 3 ] = "Tomczuk"; bazaFunkcji[ 3 ] = "Uzytkownik"; int aktualnaIlosc = 4; do { cout << "Testowa baza danych - main menu" << endl << endl; cout << "1. Wyswietl baze." << endl; cout << "2. Dodaj osobe." << endl; cout << "3. Usun osobe." << endl; cout << "0. Wyjscie. \n\n\n\n\n\n" << endl; wybor = prawidlowa(); clrscr(); if( wybor == 1 ) { int counterColumn = 1; int counterArray = 0; drawTabble(); do { cout << counterColumn << "."; gotoxy( 3, counterColumn ); cout << bazaImion[ counterArray ]; gotoxy( 18, counterColumn ); cout << bazaNazwisk[ counterArray ]; gotoxy( 35, counterColumn ); cout << bazaFunkcji[ counterArray ] << endl; counterArray++; counterColumn++; } while( counterColumn <( aktualnaIlosc + 1 ) ); getch(); clrscr(); } else if( wybor == 2 ) { if( aktualnaIlosc >= 8 ) { cout << "Dotarto do aktualnego maksimum ilosci rekordow." << endl; getch(); clrscr(); } else { cout << "Imie:" << endl; cout << "Nazwisko:" << endl; cout << "Funkcja:" << endl; gotoxy( 11, 0 ); cin >> bazaImion[ aktualnaIlosc ]; ofstream wpisImion; wpisImion.open( "imiona.txt", ios::app ); wpisImion << "\n" << bazaImion[ aktualnaIlosc ]; gotoxy( 11, 1 ); cin >> bazaNazwisk[ aktualnaIlosc ]; ofstream wpisNazwisk; wpisNazwisk.open( "nazwiska.txt", ios::app ); wpisNazwisk << "\n" << bazaNazwisk[ aktualnaIlosc ]; gotoxy( 11, 2 ); cin >> bazaFunkcji[ aktualnaIlosc ]; ofstream wpisFunkcji; wpisFunkcji.open( "funkcje.txt", ios::app ); wpisFunkcji << "\n" << bazaFunkcji[ aktualnaIlosc ]; aktualnaIlosc++; clrscr(); } } else if( wybor == 3 ) { char pewnosc; cout << "Podaj numer ID uzytkownika, ktorego chcesz usunac." << endl; cout << "Numer: "; int removeUser; do { removeUser = prawidlowaDowolna(); if( removeUser > aktualnaIlosc || removeUser < 1 ) cout << "Podales niewlasciwe ID. Sprobuj ponownie. "; } while( removeUser > aktualnaIlosc || removeUser < 1 ); cout << endl << "Chcesz usunac uzytkownika " << bazaImion[ removeUser - 1 ] << " " << bazaNazwisk[ removeUser - 1 ] << "."; cout << endl << "Czy jestes tego pewien? (y/n) "; cin >> pewnosc; if( pewnosc == 'y' || pewnosc == 'Y' ) { int remover = removeUser; if( remover == aktualnaIlosc ) { bazaImion[ remover - 1 ] = bazaZerujaca[ 0 ]; bazaNazwisk[ remover - 1 ] = bazaZerujaca[ 0 ]; bazaFunkcji[ remover - 1 ] = bazaZerujaca[ 0 ]; aktualnaIlosc--; } else if( remover < aktualnaIlosc ) { do { bazaImion[ remover - 1 ] = bazaImion[ remover ]; bazaNazwisk[ remover - 1 ] = bazaNazwisk[ remover ]; bazaFunkcji[ remover - 1 ] = bazaFunkcji[ remover ]; remover++; } while( remover <= aktualnaIlosc ); aktualnaIlosc--; } } clrscr(); } } while( wybor != 0 ); return 0; }
Komentarze mi się nieco uszkodziły... Poza tym, gdzie są jakieś nawiasy nie od pary? Ja żadnego nie znalazłem, a sam Code::Blocks usilnie dba o zamykanie wszystkich nawiasów. @Edit: ok, już widzę te nawiasy. W nowej wersji już są normalne. Niestety, wciąż nic to nie dało... |
|
pekfos |
» 2015-07-21 17:36:15 do { bazaImion[ remover - 1 ] = bazaImion[ remover ]; bazaNazwisk[ remover - 1 ] = bazaNazwisk[ remover ]; bazaFunkcji[ remover - 1 ] = bazaFunkcji[ remover ]; remover++; } while( remover <= aktualnaIlosc );
|
Dla remover równego aktualnaIlosc przy całkowitym wypełnieniu bazy, czytasz poza tablicą. Z niewyjaśnionego powodu wszędzie usiłujesz numerować elementy od 1 i tylko przy bezpośrednich odwołaniach do tablicy to korygować.. |
|
Mat Temat założony przez niniejszego użytkownika |
» 2015-07-21 17:47:34 Pekfosie, jesteś WIELKI :) Sam nie rozumiem, dlaczego nie zauważyłem, że gdy usuwam jeden element... zmniejsza mi się liczba elementów... Jeżeli ktoś jest zainteresowany, udostępniam poniżej cały, działający kod - jedynie utworzyć pliki imiona.txt, nazwiska.txt i funkcje.txt. Dziękuję bardzo za poświęcony mojemu problemowi czas i miłego dnia! #include <iostream> #include <cstdio> #include <fstream> #include <stdio.h> #include <conio.h> #include <windows.h>
using namespace std;
void gotoxy( int column, int line ) { COORD coord; coord.X = column; coord.Y = line; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord ); }
void clrscr() { for( int i = 0; i < 50; i++ ) { cout << "\n"; } gotoxy( 0, 0 ); }
void drawTabble() { gotoxy( 0, 0 ); cout << "ID"; gotoxy( 3, 0 ); cout << "Imie"; gotoxy( 18, 0 ); cout << "Nazwisko"; gotoxy( 35, 0 ); cout << "Funkcja" << endl; }
int prawidlowa() { int liczba; int lineCounter = 12; bool czyUdana; do { cin.clear(); cin.sync(); cout << "Numer opcji: "; cin >> liczba; czyUdana = cin.good(); if( czyUdana == 0 || liczba < 0 || liczba > 3 ) { gotoxy( 26, lineCounter ); cout << "Prosze podac prawidlowa liczbe z zakresu od 0 do 3." << endl; czyUdana = 0; lineCounter++; } } while( czyUdana != 1 ); return liczba; }
int prawidlowaDowolna() { int liczba; bool czyUdana; do { cin.clear(); cin.sync(); cin >> liczba; czyUdana = cin.good(); if( czyUdana == 0 ) { cout << "Prosze podac prawidlowa liczbe." << endl; czyUdana = 0; } } while( czyUdana != 1 ); return liczba; }
int main() { unsigned int wybor; unsigned int wskaznik; string bazaZerujaca[ 1 ]; string bazaImion[ 8 ]; string bazaNazwisk[ 8 ]; string bazaFunkcji[ 8 ]; ifstream imiona( "imiona.txt" ); wskaznik = 0; if( !imiona ) { cout << "Nie mozna otworzyc pliku ''imiona.txt''. Prawdopodobnie nie istnieje."; getchar(); return 1; } while( !imiona.eof() ) imiona >> bazaImion[ wskaznik++ ]; imiona.close(); ifstream nazwiska( "nazwiska.txt" ); wskaznik = 0; if( !nazwiska ) { cout << "Nie mozna otworzyc pliku ''nazwiska.txt''. Prawdopodobnie nie istnieje."; getchar(); return 1; } while( !nazwiska.eof() ) nazwiska >> bazaNazwisk[ wskaznik++ ]; nazwiska.close(); ifstream funkcje( "funkcje.txt" ); wskaznik = 0; if( !funkcje ) { cout << "Nie mozna otworzyc pliku ''funkcje.txt''. Prawdopodobnie nie istnieje."; getchar(); return 1; } while( !funkcje.eof() ) funkcje >> bazaFunkcji[ wskaznik++ ]; funkcje.close(); int aktualnaIlosc = 8; do { cout << "Testowa baza danych - main menu" << endl << endl; cout << "1. Wyswietl baze." << endl; cout << "2. Dodaj osobe." << endl; cout << "3. Usun osobe." << endl; cout << "0. Wyjscie. \n\n\n\n\n\n" << endl; wybor = prawidlowa(); clrscr(); if( wybor == 1 ) { int counterColumn = 1; int counterArray = 0; drawTabble(); do { cout << counterColumn << "."; gotoxy( 3, counterColumn ); cout << bazaImion[ counterArray ]; gotoxy( 18, counterColumn ); cout << bazaNazwisk[ counterArray ]; gotoxy( 35, counterColumn ); cout << bazaFunkcji[ counterArray ] << endl; counterArray++; counterColumn++; } while( counterColumn <( aktualnaIlosc + 1 ) ); getch(); clrscr(); } else if( wybor == 2 ) { if( aktualnaIlosc >= 8 ) { cout << "Dotarto do aktualnego maksimum ilosci rekordow." << endl; getch(); clrscr(); } else { cout << "Imie:" << endl; cout << "Nazwisko:" << endl; cout << "Funkcja:" << endl; gotoxy( 11, 0 ); cin >> bazaImion[ aktualnaIlosc ]; ofstream wpisImion; wpisImion.open( "imiona.txt", ios::app ); wpisImion << "\n" << bazaImion[ aktualnaIlosc ]; gotoxy( 11, 1 ); cin >> bazaNazwisk[ aktualnaIlosc ]; ofstream wpisNazwisk; wpisNazwisk.open( "nazwiska.txt", ios::app ); wpisNazwisk << "\n" << bazaNazwisk[ aktualnaIlosc ]; gotoxy( 11, 2 ); cin >> bazaFunkcji[ aktualnaIlosc ]; ofstream wpisFunkcji; wpisFunkcji.open( "funkcje.txt", ios::app ); wpisFunkcji << "\n" << bazaFunkcji[ aktualnaIlosc ]; aktualnaIlosc++; clrscr(); } } else if( wybor == 3 ) { char pewnosc; cout << "Podaj numer ID uzytkownika, ktorego chcesz usunac." << endl; cout << "Numer: "; int removeUser; do { removeUser = prawidlowaDowolna(); if( removeUser > aktualnaIlosc || removeUser < 1 ) cout << "Podales niewlasciwe ID. Sprobuj ponownie. "; } while( removeUser > aktualnaIlosc || removeUser < 1 ); cout << endl << "Chcesz usunac uzytkownika " << bazaImion[ removeUser - 1 ] << " " << bazaNazwisk[ removeUser - 1 ] << "."; cout << endl << "Czy jestes tego pewien? (y/n) "; cin >> pewnosc; if( pewnosc == 'y' || pewnosc == 'Y' ) { int remover = removeUser; if( remover == aktualnaIlosc ) { bazaImion[ remover - 1 ] = bazaZerujaca[ 0 ]; bazaNazwisk[ remover - 1 ] = bazaZerujaca[ 0 ]; bazaFunkcji[ remover - 1 ] = bazaZerujaca[ 0 ]; aktualnaIlosc--; } else if( remover < aktualnaIlosc ) { do { bazaImion[ remover - 1 ] = bazaImion[ remover ]; bazaNazwisk[ remover - 1 ] = bazaNazwisk[ remover ]; bazaFunkcji[ remover - 1 ] = bazaFunkcji[ remover ]; remover++; } while( remover < aktualnaIlosc ); aktualnaIlosc--; } } clrscr(); } } while( wybor != 0 ); return 0; }
|
|
« 1 » |