写入二进制文件不起作用

时间:2015-10-22 04:13:49

标签: c++ fstream

下面的代码编译并成功运行但在退出时却没有任何内容写入文件。文件被创建,在选择注册时它会询问所有细节并显示消息注册成功。文件customers.data是空的(文件大小为0kb)。函数write不会将对象写入文件。代码中的所有内容似乎都是正确的。无法识别错误。请帮忙

主程序:

int main()
{
    int ch;
    Customer cust;
    fstream file;
    file.open("customers.data",ios::out|ios::app|ios::binary);
    if(!file)
    {
        cout<<"\nError Files are missing. Unable to create files\n";
        system("pause");
        exit(1);
    }
    cout << "WELCOME! Press any key to continue.\n\n";
    system("pause");
    do
    {
        system("cls");
        cout<<"\n\n\n";
        cout<<"1->Login"<<endl;
        cout<<"2->Register"<<endl;
        cout<<"3->Exit"<<endl;
        cout<<"Choose An option: ";
        cin>>ch;
        switch(ch)
        {
        case 1:
            if(cust.Login()==true)
            {
                LaunchCustomerMenu();
            }
            else
            {
                cout<<"Incorrect Email/Password\n";
                system("pause");
            }

            break;
       case 2:
        cust.Register();
        file.write((char*)&cust, sizeof(cust)); //does not work
        if(!file.fail()) //still true
        {
            cout<<"\n\nRegistration Successful"<<endl;
            system("pause");
        }
         else
            {
                cout<<"\nTheir was a Error processing your Registration\n";
                system("pause");
            }

            break;
        case 3:
            exit(0);
            break;
        default:
            cout<<"\n\nWRONG OPTION\n";
            cout<<"Choose Again\n\n";
            system("pause");
        }
        cin.ignore();
    }
    while(ch!=3);
    file.close();
    return 0;
}

班级:

class Customer
{
private:
    unsigned int CustomerID;
    string CustomerName;
    string CustomerAddress;
    string CustomerEmail;
    string CustomerPassword;
    unsigned int CustomerPhone;
public:
    Customer();

    void Register();
    bool Login();

    unsigned int getID();
    string getName();
    string getEmail();
    string readPassword();
    unsigned int getPhone();
    unsigned int RandomID();

    void modifyName();
    void modifyAddress();
    void modifyEmail();
    void modifyPassword();
    void modifyPhone();
};

CustomerID是随机生成的。

功能寄存器:

void Customer::Register()
{
    cout<<"Enter Your Name: ";
    cin.ignore();
    getline(cin,CustomerName);
    cout<<"Enter Your Address: ";
    cin.ignore();
    getline(cin,CustomerAddress);
    cout<<"Enter Your Email: ";
    cin>>CustomerEmail;
    cout<<"Enter A Password: ";
    cin.ignore();
    getline(cin,CustomerPassword);
    cout<<"Enter Your Phone no. :";
    cin>>CustomerPhone;
}

修改 根据下面的答案,我添加了对file.fail()的检查,但它返回false并且customers.data为空,即write操作无法写入对象。

2 个答案:

答案 0 :(得分:4)

fstream write调用返回对自身的引用,因此选项3的if检查总是返回true。您需要调用其中一个goodbadfail函数来检查它是否真的成功。

此外,将对象的实际内容写入任何地方(套接字,磁盘等)通常是个坏主意。您应该查找序列化的概念。这是将类数据写入磁盘的正确方法。

答案 1 :(得分:2)

同样的事情发生在我身上,我设法找到错误。

使用传统的char变量类型声明一个数组来保存字符串值时,它工作正常。

它们似乎是字符串库实现的一些问题。即使您在某种程度上能够在读取时使用字符串数据类型将值写入文件,值也会生成运行时错误(SIGSEGV)。我认为该字符串使用指针进行动态变量分配,不适合与文件一起使用。这会生成SIGSEGV,因为在运行程序后,已分配的变量空间不再保留在内存中。