我正在制作一个小的ATM银行系统。
我在问如何从文本文件(数据库)中获取值并将其用于某些变量中。
我已经可以将name
,age
,money
,card number
和pin
存储到文本文件中,但是在尝试验证.txt文件中的名称和图钉。
这是代码。该程序有2个版本:英语和罗马尼亚语。我只制作了“ ro”部分(“ en”部分只是介绍),它只是文件的读/写部分:
void ro_utilizator_nou()
{
system ("cls");
string nume;
int ziuac, lunac, anc, ziuan, lunan, ann, varsta, anbisect, bani=0;
time_t t = time(NULL);
tm* timePtr = localtime(&t);
ziuac=timePtr->tm_mday;
lunac=timePtr->tm_mon+1;
anc=timePtr->tm_year+1900;
nume_gresit:
cout<<"Introduceti numele: "<<endl;
cin>>nume;
cin.sync();
if (!string_litere(nume)){system("cls");goto nume_gresit;}
data_gresita:
cout<<"Va rugam sa va introduceti data nasterii."<<endl;
cout<<"Introduceti ziua nasterii:"<<endl;
cin>>ziuan; cin.clear(); cin.ignore();
if (ziuan<1 || ziuan>31) {system("cls"); goto data_gresita;}
cout<<"Introduceti luna nasterii:"<<endl;
cin>>lunan; cin.clear(); cin.ignore();
if (lunan<1 || lunan>12) {system("cls"); goto data_gresita;}
cout<<"Introduceti anul nasterii:"<<endl;
cin>>ann; cin.clear(); cin.ignore();
if (ann>2018 || ann<1900) {system("cls"); goto data_gresita;}
if ((ann % 4 == 0 && ann % 100 != 0 ) || ann % 400 == 0) anbisect = 1; else anbisect = 0; //stabilirea daca anul nasterii este bisect sau nu
if (ziuan<1 || (lunan==2 && anbisect==1 && ziuan>29) || (lunan==2 && anbisect==0 && ziuan>28) || ((lunan==1 || lunan==3 || lunan==5 || lunan==7 || lunan==8 || lunan==10 || lunan==12) && ziuan>31) || ((lunan==4 || lunan==6 || lunan==9 || lunan==11) && ziuan>30) )
{system("cls"); cout<<"Data nasterii incorecta!"<<endl<<endl;; goto data_gresita;}
varsta=anc-ann; //stabilirea varstei
if (lunan>lunac) varsta--;
else if (lunan==lunac) if (ziuan>ziuac) varsta--;
cout<<endl<<"Aveti "<<varsta<<" ani."<<endl;
if (varsta<14) {
cout<<"Ne pare rau, nu puteti avea un card de credit daca nu aveti minim 14 ani impliniti."<<endl<<endl;
system("pause");
main();
}
int card_number = generare_card_number();
int card_pin = generare_pin();
cout<<"Numarul cardului (si al contului) dumneavoastra este: "<<card_number<<endl;
cout<<endl<<"ATENTIE! Urmeaza sa va afisam codul secret PIN!!!"<<endl<<"(Apasati orice tasta)"<<endl;
cin.ignore(); cout<<"Pinul dumneavoastra este: "<<card_pin<<endl;cin.ignore();
ofstream new_data_base("database.txt", ios::app);
new_data_base << nume << ' ' << varsta << ' ' << bani << ' ' << card_number << ' ' << card_pin <<endl;
new_data_base.close();
}
void ro_utilizator_existent()
{
ifstream data_base("database.txt");
string nume, nume2;
int pin, optiune, inregistrat, varsta, bani, card_number, card_pin;
if (!data_base.eof()){
data_base >> nume >> varsta >> bani >> card_number >> card_pin;
}
nume_gresit:
system ("cls");
cout<<"Introduceti numele: "<<endl;
cin>>nume2;
cin.sync();
if (!string_litere(nume2)){system("cls");goto nume_gresit;}
while (data_base >> nume){
if (nume == nume2) goto pin_gresit;
else {
system("cls");
cout<<"Nume gresit! Nu sunteti inregistrat?"<<endl;
repetare:
cout<<"1 - Sunt inregistrat"<<endl<<"2 - Nu sunt inregistrat"<<endl;
cin>>inregistrat; cin.clear(); cin.ignore();
if (inregistrat==1) goto nume_gresit;
else if (inregistrat==2) ro_utilizator_nou();
else {system("cls"); goto repetare;
}
}
}
pin_gresit:
cout<<"Introduceti PIN-ul:"<<endl;
cin>>pin; cin.clear(); cin.ignore();
while (data_base >> nume >> varsta >> bani >> card_number >> card_pin){
if (pin == card_pin) goto reusit;
else {system("cls"); cout<<"PIN gresit!"; goto pin_gresit;}
}
reusit:
system("cls");
cout<<"Logare reusita!"<<endl<<endl;
optiune_gresita:
cout<<"1. Informatii cont."<<endl;
cout<<"2. Cautare utilizator."<<endl;
cout<<"3. Adaugare fonduri."<<endl;
cout<<"4. Transfer bancar."<<endl;
cout<<"5. Retragere numerar."<<endl<<endl;
cout<<"9. Delogare."<<endl<<endl;
cin>>optiune;
}
当我输入一个合适的名字时,就说这个名字是错误的。或名称正确时,任何数字都将被视为正确的引脚。
p.s .:随着时间的推移,我计算出了年龄(“ varsta”); 第2页:“ bani”表示金钱 p.s.3:我从https://www.youtube.com/watch?v=p3m3qLNX9zA中举了一些例子,但这是不同的;我的代码(整个)在这里:https://www.mediafire.com/file/zmujjs9014mej7c/BCR_ATM.cpp/file
答案 0 :(得分:0)
编写文件时,每个人都在一行上:
new_data_base << nume << ' ' << varsta << ' ' << bani << ' ' << card_number << ' ' << card_pin <<endl;
因此,当您读取文件时。始终一次读取整个记录。这样一来,您不必担心部分读取或找到下一条记录的开始。
所以替换:
while (data_base >> nume){
与
while ( data_base >> nume >> varsta >> bani >> card_number >> card_pin ) {
然后,您可以删除尝试忽略的部分,或者忽略或提取对象的不同部分。
我的下一条建议很重要。
您正在使用许多不良习惯。您需要立即停止。您需要有关如何编写代码的一些实际建议。如果沿着这条路走下去,您将陷入代码无法挽救的糟糕境地。
停止使用MediaFire托管您的源。没人会下载它。给自己一个github account。