【问题标题】:Why is ios::app (append) not working in C++?为什么 ios::app (append) 在 C++ 中不起作用?
【发布时间】:2016-04-07 19:00:29
【问题描述】:

我正在使用带有 Code::Blocks 的 GNU C++。 在以下代码中,我使用 ios::app 将数据附加到文件 "employee.txt" 的末尾。该代码在 Turbo C++ 中运行良好,但 GNU C++ 似乎造成了一些麻烦。没有数据存储在文件中。可能的原因和解决方法是什么?

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

        if(ch==1)
    {
        cout<<"Enter Data for employee\n";
        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 search\n";
        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 Found\n";
        }
        f.close();
    }

【问题讨论】:

  • 您应该始终检查函数是否成功,即if (f.is_open()) ...
  • 根据您的代码,您在尝试追加时使用ios::out,在尝试搜索员工时使用ios::app。你确定你没看错?此外,您的代码示例不是最小的。你能隔离导致问题的部分吗(也许是一个新的 main 函数,只有几行用于打开和尝试附加一些东西)?
  • 稍微修改了我的代码,请再查看一下。
  • 代码还是太多了。请提供一个最小的例子。
  • 使代码更小。我认为答案解决了这个问题。

标签: c++ gcc file-io file-handling


【解决方案1】:

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

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

也就是说,您可能不想使用读/写,而是使用&lt;&lt;&gt;&gt; 来读写文件。

例如

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

...

f << e;

【讨论】:

  • 是的,我完全犯了那个错误。只有一件事,我应该在另一个分支中使用什么?
  • 我再次编辑了我的代码。添加数据后创建的文件仍然是空的。附加似乎不起作用。
  • 在 ch==1 中你应该有 f.open("employee.txt", ios::app|ios::binary); 并且在 ch==2 你应该有 f.open("employee.txt", ios::in|ios::binary) app 将文件指针设置到文件的末尾,因此打开文件以使用 app 读取没什么意义
  • 它工作过一次。下一次没有。我已经更新了问题中的代码。
  • 也许在您回答后问题已被编辑,但给出的示例中没有 C I/O。有二进制 I/O,但 C++ 流确实支持(假设它们已正确打开)。通常,二进制 I/O 和流插入运算符的使用用于不同的事情。
【解决方案2】:

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

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

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

【讨论】:

  • 它工作过一次。下一次没有。我已经更新了问题中的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
相关资源
最近更新 更多