gpt4 book ai didi

c++ - 当参数是目录时,Ifstream open() 不设置错误位

转载 作者:可可西里 更新时间:2023-11-01 16:41:11 25 4
gpt4 key购买 nike

在 C++ 程序中,使用 std::ifstream,我试图打开一个用户指定的文件——到目前为止一切顺利。然而,我不小心输入了一个实际上是目录的文件名,我很惊讶地发现尝试打开()该目录没有产生任何错误。

这是一个最小的例子:

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”,这是合理的。使用 >> 运算符会引发下溢异常,这也是可以的。

现在,我的问题是,我如何检测到用户输入的是目录名而不是正确的文件名?有什么办法吗?从流中获取和取消获取字节似乎很乏味且容易出错。

另外,为什么会这样?我意识到从程序的角度来看,它们都是相同的数据,但我假设操作系统也会发送一些“嘿,这是一个目录”之类的消息。

最佳答案

你没有说你的系统是什么,所以很难说,但一般来说,filebuf::open 只会在您的系统级别打开时返回错误失败。我在 Unix 系统上工作过,你可以在其中 open()目录;我什至做了一些你可以在之后阅读的地方打开(至少如果它是本地安装的文件系统)。

至于怎么办:我能想到的就是尝试get第一个字符,然后把它放回去。但如果文件是空的,所以它也不是真正的解决方案。在系统级(和从 QoI 的角度来看,如果系统确实允许打开目录),您可以使用系统级调用(stat 在 Unix 中)确定文件是否为目录。(当然,存在竞争条件:在您检测到这是一个普通文件,当你打开的那一刻,另一个进程可以删除文件并创建目录。这可能不是一个然而,经常发生。)

关于c++ - 当参数是目录时,Ifstream open() 不设置错误位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9591036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com