Witam serdecznie w tę jakże ciemnawą noc - wolną od chaosu,
otóż napotkałem się z pewnym błędem. Jednakże zaczne od rozpisania odpowiedzi na pytanie - co to za program?
Mniej więcej służy on tak, że możemy wyswietlać kategorie, dodawać je oraz usuwać. Problem polega na tym, że gdy funkcją remove usuwam plik "categories.txt", to jeśli nie zrestartuje programu, odpalając kolejno void addCategory(); - pytanie o nazwę kategorii wyświetla się dwa razy. Wcześniej miałem taki błąd, że program zamiast wypisywać dwa razy pytanie o nazwę kategorii, tj. sam klikał enter - rozwiązałem to instrukcją: if(name_category=="") goto answer; - no ale problem zamienił się na inny...
Poniżej kodzik z miejsc głównego problemu:
void addCategory() { // dodaje kategorie, w ktorej bedzie mozna dodac baze kont
system("cls");
string temp2;
vector <string> temp;
int x=0;
string name_category;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << endl;
cout << "-------------------"<< endl;
cout << "DODAWANIE KATEGORII"<< endl;
cout << "-------------------"<< endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
answer_again:
cout << "Nazwa nowej kategorii: "; getline(cin, name_category);
if (name_category == "") goto answer_again;
fstream zapis; // zapisuje nazwe kategorii z uprzednio zapisanym numerem
zapis.open("bin/categories.txt", ios::out | ios::app);
if (zapis.good() == false) cout << "Nie mozna otworzyc pliku z kategoriami!";
else {
zapis << name_category << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << endl << "Pomyslnie utworzono nowa kategorie.";
Sleep(1500);
}
zapis.close();
}
void removeCategory() { // usuwa jedna wybrana kategorie
system("cls");
int choice; // wybor kategorii do usuniecia
int o = 0; // do wyswietlania numerow kategorii
char w; // w jak wait, pomocna
string answer; // do uzycia w: czy na pewno usunac kategorie ... ? odp. y/n
vector <string> temp;
vector <string> temp3; // tu bedzie wpisana kopia nazw bez zadnego "" i tworzony po chwilii nowy plik.txt
ifstream odczyt;
odczyt.open("bin/categories.txt");
if (odczyt.good() == false) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
cout << "Nie stworzyles jeszcze zadnej kategorii!";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(1500);
}
else {
string temp2;
while (!odczyt.eof()) {
getline(odczyt, temp2);
temp.push_back(temp2);
}
odczyt.close();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << "------------------"<< endl;
cout << "USUWANIE KATEGORII"<< endl;
cout << "------------------"<< endl;
cout << "Posiadane kategorie:"<< endl << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
for (size_t i = 0; i < temp.size(); i++) { // pokazuje kategorie numerowane kolejno
if (i == temp.size() - 1) continue; // inaczej przy wyswietlaniu ostatni numer nie posiada kategorii
cout << ++o << ". "<< temp[i] << endl;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << endl << "Wcisnij numer kategorii, ktora chcesz usunac: ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
cin >> choice;
choice = choice - 1;
one_more:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << endl << "Czy na pewno usunac kategorie o nazwie ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
cout << temp[choice];
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << " ? Wpisz TAK lub NIE: ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
cin >> answer;
if (answer == "nie" || answer == "NIE") {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);
cout << endl << "Za 3 sekundy nastapi wyjscie z programu...";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(3000);
exit(0);
}
else if (answer == "tak" || answer == "TAK" ) temp[choice] = "";
else goto one_more;
for (size_t i = 0; i < temp.size(); i++) { // kopiowanie danych ze zmiennej temp do zmiennej temp3 bez pustych ""
if (temp[i] == "") continue;
else {
temp3.push_back(temp[i]);
}
}
if (remove("bin/categories.txt") == 0) { // usuwamy plik aby zaraz utworzyc nowy
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);
cout << endl << endl << endl << "Prawidlowo usunieto plik z kategoriami";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(1500);
fstream zapis; // bedziemy tutaj zapisywac dane ze zmiennej kontenerowej temp3
zapis.open("bin/categories.txt", ios::out);
if (zapis.good() == false) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
cout << endl << "Nie udalo sie utworzyc pliku categories.txt";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(1500);
}
else {
zapis.seekp(0);
for (size_t i = 0; i < temp3.size(); i++) { // wczytujemy nowe dane do nowego pliku
zapis << temp3[i] << endl;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);
cout << endl << "Prawidlowo dodano nowy plik z aktualnymi kategoriami";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(1500);
zapis.close();
}
}
else {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
cout << endl << "Nie udalo sie usunac pliku z kategoriami";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(1500);
}
}
}
A poniżej kodzik z głównego kodu programu na wszelki:
#include "spis_tresci.h"
void main_menu() {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
system("cls");
cout << "-----------"<< endl;
cout << "MENU GLOWNE"<< endl;
cout << "-----------"<< endl;
cout << "[1] Wyswietl dostepne kategorie"<< endl;
cout << "[2] Dodaj kategorie"<< endl;
cout << "[3] Usun kategorie"<< endl;
cout << "[4] Dodaj konto do istniejacej kategorii"<< endl;
cout << "[5] Usun konto z istniejacej kategorii"<< endl;
cout << "----------------------------------------"<< endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
}
void showCategories() { // pokazuje dostepne kategorie
system("cls");
int x=0; // dodaje kolejno numery kategorii
char w; // w jak wait, poczekaj na przycisk, jesli bedzie nim 1, wrocisz od menu glownego
vector <string> temp;
ifstream odczyt;
odczyt.open("bin/categories.txt");
if (odczyt.good() == false) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
cout << "Nie stworzyles jeszcze zadnej kategorii!";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(1500);
}
else {
string temp2;
while (!odczyt.eof()) {
getline(odczyt, temp2);
temp.push_back(temp2);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << "-------------------"<< endl;
cout << "POSIADANE KATEGORIE"<< endl;
cout << "-------------------"<< endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
for (size_t i = 0; i < temp.size(); i++) { // pokazuje kategorie numerowane kolejno
if (i == temp.size()-1) continue; // inaczej przy wyswietlaniu ostatni numer nie posiada kategorii
cout << ++x << ". "<< temp[i] << endl;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << endl << "Nacisnij 1, by wrocic do menu...";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
w = _getch();
if (w == '1') odczyt.close();
}
}
void addCategory() { // dodaje kategorie, w ktorej bedzie mozna dodac baze kont
system("cls");
string temp2;
vector <string> temp;
int x=0;
string name_category;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << endl;
cout << "-------------------"<< endl;
cout << "DODAWANIE KATEGORII"<< endl;
cout << "-------------------"<< endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
answer_again:
cout << "Nazwa nowej kategorii: "; getline(cin, name_category);
if (name_category == "") goto answer_again;
fstream zapis; // zapisuje nazwe kategorii z uprzednio zapisanym numerem
zapis.open("bin/categories.txt", ios::out | ios::app);
if (zapis.good() == false) cout << "Nie mozna otworzyc pliku z kategoriami!";
else {
zapis << name_category << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << endl << "Pomyslnie utworzono nowa kategorie.";
Sleep(1500);
}
zapis.close();
}
void removeCategory() { // usuwa jedna wybrana kategorie
system("cls");
int choice; // wybor kategorii do usuniecia
int o = 0; // do wyswietlania numerow kategorii
char w; // w jak wait, pomocna
string answer; // do uzycia w: czy na pewno usunac kategorie ... ? odp. y/n
vector <string> temp;
vector <string> temp3; // tu bedzie wpisana kopia nazw bez zadnego "" i tworzony po chwilii nowy plik.txt
ifstream odczyt;
odczyt.open("bin/categories.txt");
if (odczyt.good() == false) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
cout << "Nie stworzyles jeszcze zadnej kategorii!";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(1500);
}
else {
string temp2;
while (!odczyt.eof()) {
getline(odczyt, temp2);
temp.push_back(temp2);
}
odczyt.close();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << "------------------"<< endl;
cout << "USUWANIE KATEGORII"<< endl;
cout << "------------------"<< endl;
cout << "Posiadane kategorie:"<< endl << endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
for (size_t i = 0; i < temp.size(); i++) { // pokazuje kategorie numerowane kolejno
if (i == temp.size() - 1) continue; // inaczej przy wyswietlaniu ostatni numer nie posiada kategorii
cout << ++o << ". "<< temp[i] << endl;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << endl << "Wcisnij numer kategorii, ktora chcesz usunac: ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
cin >> choice;
choice = choice - 1;
one_more:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << endl << "Czy na pewno usunac kategorie o nazwie ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
cout << temp[choice];
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << " ? Wpisz TAK lub NIE: ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
cin >> answer;
if (answer == "nie" || answer == "NIE") {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);
cout << endl << "Za 3 sekundy nastapi wyjscie z programu...";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(3000);
exit(0);
}
else if (answer == "tak" || answer == "TAK" ) temp[choice] = "";
else goto one_more;
for (size_t i = 0; i < temp.size(); i++) { // kopiowanie danych ze zmiennej temp do zmiennej temp3 bez pustych ""
if (temp[i] == "") continue;
else {
temp3.push_back(temp[i]);
}
}
if (remove("bin/categories.txt") == 0) { // usuwamy plik aby zaraz utworzyc nowy
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);
cout << endl << endl << endl << "Prawidlowo usunieto plik z kategoriami";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(1500);
fstream zapis; // bedziemy tutaj zapisywac dane ze zmiennej kontenerowej temp3
zapis.open("bin/categories.txt", ios::out);
if (zapis.good() == false) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
cout << endl << "Nie udalo sie utworzyc pliku categories.txt";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(1500);
}
else {
zapis.seekp(0);
for (size_t i = 0; i < temp3.size(); i++) { // wczytujemy nowe dane do nowego pliku
zapis << temp3[i] << endl;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);
cout << endl << "Prawidlowo dodano nowy plik z aktualnymi kategoriami";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(1500);
zapis.close();
}
}
else {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
cout << endl << "Nie udalo sie usunac pliku z kategoriami";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
Sleep(1500);
}
}
}