14

std::fstreams からポータブルな方法で意味のあるファイル アクセス エラー メッセージを取得する最良の方法は何ですか? badbitsandの原始性はfailbits少し面倒です。以前、win32 と POSIX に対して独自の例外階層を作成したことがありますが、これは STL の方法よりもはるかに柔軟でした。

例外が有効になっているwhatのダウンキャストされた catch ( std::exception) のメソッドから、エラー メッセージとして「basic::ios_clear」が表示されます。fstreamこれは私にはあまり意味がありませんが、問題が何であるかはわかっていますが、数か月後に展開を開始するときに私の人生が楽になるように、プログラムをもう少し有益なものにしたいと考えています。

Boost には、fstreamクロス プラットフォームおよびクロス STL 実装の実装から意味のあるメッセージを抽出するものはありますか?

4

3 に答える 3

7

失敗のより具体的な理由について、(例外ハンドラなどで) errno/もチェックすることを誰も止めません。strerror

更新 -- 移植性について

ちなみに、IIRC Visual Studio のfstream実装では_open/ _read/ _write/etc を呼び出します。を設定errnoする CRT メソッド。 Microsoft はGetLastError、CRT メソッドが返された後も正しい値が含まれていることを保証しません。cygwin、mingw などの実装にerrno同上GetLastError

したがって、私は、あなたが必要とすること、できること、したがってやりたいことは check だけであるという私のerrno主張を支持します。

Boost::Systemさて、上記のすべてを考えると、単に呼び出すのではなく使用して生活を複雑にし、過度に設計したい場合はstrerror、私の定義とエレガンスとシンプルさの定義は同じではないと思います. :)

于 2010-04-14T19:08:31.837 に答える
0

どのような情報が必要ですか? badbitI/O エラーを示します。eofbiteof を示します。failbit解析エラーを示します。

とにかく、1つの解決策を排除するために、ADLのためにネイティブ型の入力関数をオーバーライドできないと思います。から構築されるoperator>>(istream, input_safe_int)whereを実装できます。中にブロックなどを入れます。input_safe_intint&try

于 2010-04-15T13:19:36.603 に答える
0

私は幸運にも をキャッチしてstd::ios_base::failureから、using を再調達しました:std::system_errorerrno

terminate called after throwing an instance of 'std::system_error'
  what():  broken/path: No such file or directory
#include <fstream>

int main() {
  const std::string filename{ "broken/path" };
  try {
    std::ifstream file{ filename };
    file.exceptions(std::ios::failbit); // std::ios_base_failure is thrown here
  } catch (std::ios_base::failure&) {
    throw std::system_error{ errno, std::generic_category(), filename };
  }
}

これは UNIX と Windows で機能します。これは、「すべてのerrno値が … UNIX と互換性がある」ためです ( source )。

于 2021-11-05T19:12:32.477 に答える