如何使用文件中的文本,例如变量

How can I use the text from a file like variables

本文关键字:变量 文本 何使用 文件      更新时间:2023-10-16

我正在制作一个小的ATM银行系统。

我问如何从文本文件(数据库(中获取值并将其用于某些变量。

我已经可以将:nameagemoneycard numberpin存储到文本文件中,但是当我尝试验证.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;
}

当我输入一个合适的名称时,它说这个名字是错误的;或者当这个名字起作用时,任何数字都被认为是正确的引脚。

PS:随着时间的推移,我计算了年龄("varsta"(; 附言2:"巴尼"的意思是钱 p.s.3:我从 https://www.youtube.com/watch?v=p3m3qLNX9zA 中举了一些例子,但它是不同的;我的代码(完整(在这里:https://www.mediafire.com/file/zmujjs9014mej7c/BCR_ATM.cpp/file

当你写文件时,每个人都在一行上:

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 ) {

然后,您可以删除尝试忽略或提取对象不同部分的部分。

我的下一条建议很重要。

  1. 让这个工作/
  2. 转到 https://codereview.stackexchange.com
    请注意,他们只查看工作代码,因此请先执行第一步。
  3. 获取评论。这一点非常重要。

你用了这么多坏习惯。你现在需要停下来。你需要一些关于如何编写代码的真正建议。如果你继续沿着这条路走下去,你只会陷入一个非常糟糕的形状,代码是无法挽救的。

停止使用MediaFire来托管您的源。没有人会下载它。给自己一个github帐户。