【问题标题】:std::ofstream appending filesstd::ofstream 附加文件
【发布时间】:2017-08-10 03:42:01
【问题描述】:

所以我想在文件中输入一些东西,但它似乎不起作用。我的代码是这样的:

  ofstream f("reservedTables.DAT");  
  cin >> table;
  f.open("reservedTables.DAT", ios::out | ios::app);
  f << table;
  f.close();

我做错了什么?我写了变量table 的数字,但它没有出现在我放入的文件中

【问题讨论】:

    标签: c++ fstream


    【解决方案1】:

    那是因为您打开文件两次。

    如果你打电话给open,你实际上是在打电话给rdbuf()-&gt;open(filename, mode | ios_base::out)。请注意(ref):

    如果关联文件已经打开,则立即返回一个空指针。

    因为返回了一个空指针,所以分配给内部文件缓冲区,不再打开文件。这意味着任何写入它的尝试都会失败。

    如果你指定了文件名,构造函数已经打开了文件,所以你不需要调用open

    std::ofstream f("reservedTables.DAT");  
    std::cin >> table;
    f << table;
    f.close();
    

    【讨论】:

    • @rRakete1111 那么如果我不打开它,我在写入时如何附加它?对不起,我用 fstream 这么多,我知道的唯一追加方法是当你打开文件时
    • @Roland 如果您查看constructor,您会注意到它还接受默认模式作为第二个参数。
    【解决方案2】:

    快速浏览:

    ofstream f("reservedTables.DAT");  
    

    分配流并打开文件。

    cin >> table;
    

    读取用户的输入。

    f.open("reservedTables.DAT", ios::out | ios::app);
    

    尝试重新打开文件。会失败。

    f << table;
    

    打开失败后Stream处于失败状态,无法写入。

    f.close();
    

    关闭文件。

    解决方案

    只打开一次文件并检查错误。

    ofstream f("reservedTables.DAT", ios::app); // no need for ios::out. 
                                                // Implied by o in ofstream  
    cin >> table;
    if (f.is_open()) // make sure file opened before writing
    {
        if (!f << table) // make sure file wrote
        {
            std::cerr << "Oh snap. Failed write".
        }
        f.close(); // may not be needed. f will automatically close when it 
                   // goes out of scope
    }
    else
    {
        std::cerr << "Oh snap. Failed open".
    }
    

    【讨论】:

    • 感谢您的回答!
    • 旁注:ios::out 在创建std::ofstream 时不是必需的,因为它已经是一个输出流并且会添加ios::out 本身。
    • 贾。删除了错误的ios::out | 我应该知道最好不要在西部玩最快的枪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多