C++ fstream を使用して構成ファイルを読み取ります。
#include <fstream>
std::ifstream my_file(my_filename);
現在、ディレクトリのパスを渡すと、これは黙って無視されます。たとえば、ディレクトリmy_file.good()
であっても true を返します。my_filename
これは私のプログラムにとって意図しない入力であるため、チェックして例外をスローします。
開いたばかりの fstream が通常のファイル、ディレクトリ、またはストリームであるかどうかを確認するにはどうすればよいですか?
私はどちらかへの方法を見つけることができないようです:
- 指定された ifstream からファイル記述子を取得します。
- 他のメカニズムを使用して、ifstream でこの情報を見つけてください。
いくつかのフォーラム ディスカッションでは、これは OS に依存するため、どちらも不可能であり、したがって fstream C++ 標準の一部になることはできないことが示唆されました。
私が考えることができる唯一の代替手段は、コードを書き直して ifstream を完全に取り除き、ファイル記述子 ( *fp
)の C メソッドに頼ることfstat()
です。
#include <stdio.h>
#include <sys/stat.h>
FILE *fp = fopen(my_filename.c_str(), "r");
// skip code to check if fp is not NULL, and if fstat() returns != -1
struct stat fileInfo;
fstat(fileno(fp), &fileInfo);
if (!S_ISREG(fileInfo.st_mode)) {
fclose(fp);
throw std::invalid_argument(std::string("Not a regular file ") + my_filename);
}
私はfstreamの方が好きです。したがって、私の質問です。