在fstream输出操作上执行“全部捕获”错误检查的正确方法是什么?

Tru*_*eon 3 c++ file-io fstream

将数据发送到fstream时检查一般错误的正确方法是什么?

更新:我主要关心的是我听到的一些有关输出与物理写入硬盘之间的延迟的信息。我的假设是命令“ save_file_obj << save_str”仅将数据发送到某种缓冲区,并且以下检查“ if(save_file_obj.bad())”将不会用于确定是否存在操作系统或硬件问题。我只是想知道在执行以下任何操作(如关闭程序)之前,将字符串发送到文件并检查以确保将其写入磁盘的确定的“全部捕获”方法是什么。

我有以下代码...

int Saver::output()
{
    save_file_handle.open(file_name.c_str());
    if (save_file_handle.is_open())
    {
        save_file_handle << save_str.c_str();

        if (save_file_handle.bad())
        {
            x_message("Error - failed to save file");
            return 0;
        }

        save_file_handle.close();

        if (save_file_handle.bad())
        {
            x_message("Error - failed to save file");
            return 0;
        }

        return 1;
    }
    else
    {
        x_message("Error - couldn't open save file");
        return 0;
    }
} 
Run Code Online (Sandbox Code Playgroud)

小智 5

几点。首先:

save_file_handle
Run Code Online (Sandbox Code Playgroud)

是C ++ fstream实例的较差名称。fstreams不是文件句柄,而这只能使读者感到困惑。

其次,正如Michael所说的那样,无需将C ++字符串转换为C字符串。只有在与C风格的APIS接口​​时,以及在使用一些设计较差的C ++ API(例如(不幸的是)fstream :: open())时,您才真正发现自己要这样做。

第三,测试流操作是否正常的规范方法是测试操作本身。流已转换为void *,这意味着您可以编写如下内容:

if ( save_file_handle << save_str ) {
   // operation worked
}
else {
   // failed for some reason
}
Run Code Online (Sandbox Code Playgroud)

您的代码应始终测试v流操作,无论是输入还是输出。

  • @Neil,没关系,您是对的...我一直以为是布尔型(因为void *隐式转换为布尔型)。我从未意识到它实际上是无效的*。很有意思,您知道他们为什么选择该约定吗?实际上,可以对void *对象做任何事情吗? (2认同)