如何在以下代码中解决此逻辑错误?

时间:2019-08-03 00:13:23

标签: c++ file-io

当我将用户名与密码一起存储在文件中时,将其附加到一个数组中,我没有存储在文件中的名称随之出现。

此代码在Borland C ++中。

void new_user()

{

    clrscr();

    cout<<"\nEnter your name: ";
    gets(name);

    cout<<"\nEnter your phone number: ";
    gets(phone);

    cout<<"\nEnter your email: ";
    gets(email);

    cout<<"\nEnter your address: ";
    cout<<"\nHouse no. and Area: ";
    gets(area);
    cout<<"\nCity: ";
    gets(city);
    cout<<"\nState: ";
    gets(state);
    cout<<"\nEnter the pincode: ";
    cin>>pincode;
    getch();
    int x=1;
    while(x==1)
    x=createuser();

}


int createuser()

{

            char username[20];
    int c=0;
    ofstream fout,f;
    ifstream fin;
    cout<<"\nCreate a username (max. 10 letters): ";
    fout.open("usern.txt",ios::out|ios::app);
    gets(uname);
    fout<<uname;
    fout.close();

    fin.open("usern.txt",ios::in|ios::beg);

    while(!fin.eof())
    {
        fin>>username;
        if(strcmp(username,uname)==0)
        c++;

    }

    fin.close();
    fout.open("usern.txt",ios::app);
    if(c>1)
    {
        cout<<"\nUsername already exists!";
        return (1);
    }


    else
    {

        cout<<"\nCreate a password (max. 10 letters): ";

        for(int i=0;i<10;i++)
        {
            password[i]=getch();
            cout<<"*";
        }
        fout<<password<<'\n';
        cout<<"\nUser registered successfully!";
        cout<<"\nThank you for signing up to Hindustan Tours and Travels";
        f.close();

        return(2);
 }

当我输入用户名“ iniyan2003”和密码“ iniyan0307”时,预期的文件数据应为“ iniyan2003iniyan0307”。而是“ iniyan2003iniyan0307Iniyan”。

1 个答案:

答案 0 :(得分:2)

    for(int i=0;i<10;i++)
    {
        password[i]=getch();
        cout<<"*";
    }
    fout<<password<<'\n';

您用getch读取了10个字符,因此有10个字符的数组。但是然后您将其视为是 string ,而不是。最后一行没有办法知道应该写十个字符,所以它写的更多。

字符串是C语言中的特定内容,与字符数组不同。除非您向其传递实际的C样式字符串,否则请勿使用字符串函数(例如strcmpoperator<<(const char *))。实际上,由于您使用C ++进行编码,因此根本不要使用C样式的字符串。使用std::string并使用if (a=="hello")之类的东西代替if ((strcmp(a, "hello")==0),使您的生活更轻松。

此代码还有很多其他问题。我要指出的另一个:

while(!fin.eof())
{
    fin>>username;
    if(strcmp(username,uname)==0)
    c++;

}

您不检查读取是否成功,而只是假设读取成功。似乎您期望eof()函数能够预测将来的读取是否成功。那不是它的作用,它只会告诉您过去,并且不能代替检查读取是否成功。