【发布时间】:2012-03-24 08:44:51
【问题描述】:
在一个 C++ 程序中,使用 std::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”,这是合理的。使用 >> 运算符会引发下溢异常,这也是可以的。
现在,我的问题是,我如何检测到用户输入的是目录名而不是正确的文件名?有没有办法做到这一点?从流中获取和取消获取字节似乎很乏味且容易出错。
另外,为什么会这样?我意识到从程序的角度来看,这都是相同的数据,但我假设操作系统也会发送一些“嘿,这是一个目录”之类的消息。
【问题讨论】:
-
你在什么平台上得到这种行为?
-
C++ 没有“目录”的概念。您需要一些特定于平台的库(如 Posix 或 Windows)。
-
哦,Ubuntu 10.04,编译器是gcc 4.4.3。
-
@KerrekSB : ...或者像 Boost 或 Qt 这样的可移植库。
-
在某些平台上,打开目录并从中读取是一件非常有效的事情。如果您使用的是类 Unix 平台,则可以使用 fstat 来确定它是什么类型的文件。 Windows 也有办法做到这一点。