fopenとifstream.open()の両方でディレクトリをファイルとして開くときに、正しいエラーコードをerrnoから取得しようとしています。私はEISDIRを期待して、EACCESを取得します。ウィンドウ上のディレクトリでfopenを使用する
Windows 7 x64でMSVC 12.0ツールチェーンをコンパイル(および実行)しています。
著者は「ストリームフェイルビット(またはbadbit)。エラー状態:ディレクトリです」という記事を読んでいます(https://gehrcke.de/2011/06/reading-files-in-c-using-ifstream-dealing-correctly-with-badbit-failbit-eofbit-and-perror/)。
私は、GCC 4.6(またはこれ以上、atm)でauthorsファイルをコンパイルし、ディレクトリを引数として渡すとEACCESも取得します。
私は、ディスクオブジェクトがWindows上のディレクトリであるかどうかを簡単に伝える方法がないことを知っています。そのため、EISDIRを取得してもあまり驚くことではありません。
これについて何かできることはありますか(ウィンドウ上でEISDIRを取得する、つまり)? 同様の(予期しない)方法で動作する他のerrnoがありますか?
いつものように[MCVE]を提供してください。また、ダイレクトをファイルとして開くこともできません。 –
私はあなたが運が悪いと思う - 私は、Microsoft Cライブラリで参照されている 'EINVAL'と' is_a_directory'シンボル(私はVS 12.0とユニバーサルCRTをVS 14.0で使用したものをチェックした)定義自体、つまりそれらはそこにありますが、使用されていません。代わりのもの(MinGWなど)はmsvcrt.dllにリンクしていますが、あなたはどちらかの方法で動作しないことを既に確認しています。 – cynic
私は、デバイスオブジェクトがファイルかディレクトリかどうかをチェックするのにerrnoを使うのは良い選択ではないと思います。このメソッドはプラットフォームとコンパイラに依存するため不安定で、C++標準ではifstreamエラーの処理の動作を記述していません。 –