为什么ios::app(append)在C++中不起作用

Why is ios::app (append) not working in C++?

本文关键字:C++ 不起作用 append ios app 为什么      更新时间:2023-10-16

我使用的是带有代码::块的GNU C++。在下面的代码中,我使用ios:app在文件"employee.txt"的末尾添加数据。该代码在Turbo C++中运行良好,但GNU C++似乎造成了一些麻烦。文件中未存储任何数据。可能的原因和解决方案是什么?

编辑-在尝试了这里给出的解决方案后,它奏效了,但现在又出现了同样的问题。即使在输入数据之后,文件仍然是空的。我已经更新了代码。

        if(ch==1)
    {
        cout<<"Enter Data for employeen";
        e.getdata();
        f.open("employee.txt", ios::app|ios::binary);
        f.write((char*)&e, sizeof(employee));
        f.close();
    }
    if(ch==2)
    {
        int en;
        int flag=0;
        cout<<"Enter Employee No. to searchn";
        cin>>en;
        f.open("employee.txt", ios::in | ios::binary );
        f.read((char*)&e, sizeof(e));
        while(f)
        {
            if(e.reteno()==en)
            {
                flag=1;
                e.putdata();
            }
            f.read((char*)&e, sizeof(e));
        }
        if(flag==0)
        {
            cout<<"Record Not Foundn";
        }
        f.close();
    }

在分支ch==1中,您应该指定ios::app才能添加记录。即ios::app|ios::out|ios::binary

读取时,不应指定ios::app,因为您希望从头开始读取。而是使用ios::in|ios::binary

也就是说,您可能希望使用<<>>来读取和写入文件,而不是使用读/写。

例如

ofstream& operator<<(ofstream& f, const employee& e)
{
    f << e.eno << ',' << e.name << ',' << e.balance;
    return f;
}
...
f << e;

ios::app模式下打开要读取的文件是没有意义的,因为ios::app会将文件指针移动到文件的末尾,这样您添加的任何内容都会附加到它。

ch == 1中使用f.open ("employee.txt", ios::app | ios::binary);。这将打开文件供您附加。

ch == 2中使用f.open("employee.txt", ios::in | ios::binary)。这将打开文件供您从中读取。