如何使用文件(如变量)中的文本

时间:2018-10-21 17:28:56

标签: c++ file

我正在制作一个小的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;
}

当我输入一个合适的名字时,就说这个名字是错误的。或名称正确时,任何数字都将被视为正确的引脚。

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

1 个答案:

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

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

我的下一条建议很重要。

  1. 开始工作/
  2. 转到https://codereview.stackexchange.com
    请注意,它们仅查看有效的代码,因此请首先执行第一步。
  3. 获取评论。这非常重要。

您正在使用许多不良习惯。您需要立即停止。您需要有关如何编写代码的一些实际建议。如果沿着这条路走下去,您将陷入代码无法挽救的糟糕境地。

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