我可以混合使用C和C ++ IO吗?

时间:2016-06-11 02:29:50

标签: c++ error-handling iostream

简介

sync_with_stdio,默认情况下启用,表示内部C和C ++为其流使用相同的缓冲区。但除此之外没有互操作性。我无法从basic_rdbuf构建FILE,我需要使用basic_rdbuf::open

我想做什么

我想在IO中使用例外但是存在问题。确实,您可以使用strerror来获取错误消息,但这是在堆栈中的方式。 C ++ IO只有一个例外(failure),它只有一个错误代码(io_errc::stream)。没有粒度,因此远离实际发生错误的位置捕获异常并没有多大帮助。

这是另一个问题。您可以将其配置为在failbit上抛出异常。但并非所有failbit错误都是例外。例如:

try 
{
  filestr.open(":^(");

  if (!(file >> input))
  {
      // error
  }
}
catch (ios_base::failure& e) 
{
    cout << strerror(errno);
}

这组&#34;糟糕的用户输入&#34;用&#34;文件不存在&#34;,我认为这是糟糕的设计。

理想情况下,我希望将问题分开。类似的东西:

try
{
    auto file = std::fopen(...);

    if ( /* bad conditional */ )
       throw custom_exception_with_error_code(errno);
} catch (custom_exception_with_error_code& e)
{
    if (e.code() == some_error_code)
    {
        /* handle error */
    }
}

auto stream = std::some_something_that_accepts_file(file);

/* ... */

这只是一个粗略的草图。我正在制定细节。

道德

理想情况下,我不必从头开始编写庞大的自定义流类。我正在寻找友好的内置方式来做到这一点。有可能吗?

我也在用我的方法寻找有关缺陷的建议。

0 个答案:

没有答案