C++プログラムでは、std :: ifstreamを使用して、ユーザー指定のファイルを開こうとしています。しかし、誤って実際にディレクトリであるファイル名を入力しましたが、open()しようとするとエラーは発生しませんでした。引数がディレクトリのときにIfstream open()がエラービットを設定しない
std::ifstream f;
f.open("..");
if(!f.is_open() || !f.good() || f.bad() || f.fail()) {
std::cout << "error bit set on open" << std::endl;
return 1;
}
ここでエラーの兆候:
はここで、最小限の例です。私がgetline()を実行しようとすると、getline()はエラービットを正しく設定します。
std::string str;
getline(f, str);
if(f.eof()) std::cout << "getline set eofbit" << std::endl;
else if(f.bad()) std::cout << "getline set badbit" << std::endl;
else if(f.fail()) std::cout << "getline set failbit" << std::endl;
"getline set badbit"が出力されます。これは妥当です。 >>演算子を使用するとアンダーフロー例外がスローされますが、これも問題ありません。
私の質問は、ユーザーが適切なファイル名ではなくディレクトリ名を入力したことをどのように検出することができたかです。それを行う方法はありますか?ストリームからのバイトの取得と削除は面倒でエラーが発生しやすいようです。
また、これはなぜですか?私はそれがプログラムの観点からは全く同じデータであることを理解していますが、私はOSが "やあ、これはディレクトリです"というようなメッセージを送ると仮定します。
この動作はどのプラットフォームで発生していますか? –
C++には「ディレクトリ」という概念はありません。プラットフォーム固有のライブラリ(PosixやWindowsなど)が必要です。 –
ああ、Ubuntu 10.04、コンパイラはgcc 4.4.3です。 –