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);
/* ... */
这只是一个粗略的草图。我正在制定细节。
理想情况下,我不必从头开始编写庞大的自定义流类。我正在寻找友好的内置方式来做到这一点。有可能吗?
我也在用我的方法寻找有关缺陷的建议。