检查是否存在给定的多个文件

时间:2017-04-05 16:20:33

标签: c++ ifstream

我是C ++的新手。陷入现有代码库的一部分,我需要确定是否存在两个文件。如果其中任何一个存在或两者都存在,我们需要设置一个标志。

该代码段如下:

bool Flag = false;
string string_one, string_two;
string_one = "/blah/blah/bhah1.ext";
string_two = "/blah/blah/bhah2.ext";

std::ifstream fs1( string_one.c_str() );
if ( (bool)fs1 ==  false )
  Flag = true;

std::ifstream fs2( string_two.c_str() );
if ( (bool)fs2 == false )
  Flag = true;

现在,问题是:

如果string_one是现有文件,则第一个if工作正常,并且Flag的值不会更改(仍为false)。但是,如果string_two也存在,则Flag的值会以某种方式设置为true。跑调试器,发现控件最后进入if ( (bool)fs2 == false )

是否因为使用std::ifstream两次?

我可能会问一个愚蠢的问题。提前谢谢!

2 个答案:

答案 0 :(得分:3)

在你的帖子中,你说如果存在任何一个(或两个)文件你想要设置标志。如果它们不存在,则您当前的代码会设置该标志(无法打开它们进行读取)。尝试这样的事情:

bool flag = false;

std::string string_one = "/blah/blah/bhah1.ext";
std::string string_two = "/blah/blah/bhah2.ext";

std::ifstream fs1(string_one.c_str());
std::ifstream fs2(string_two.c_str());

if (fs1 || fs2) {
  flag = true;
}

如果其中一个成功打开以供阅读,则会将flag设置为true。如果您想要设置标志,如果不存在,只需在if语句中否定表达式。您也可以执行以下操作(如上文对您的问题的评论中所述):

flag = !fs1 || !fs2;

答案 1 :(得分:0)

如果您的编译器兼容C ++ 17,则应使用<filesystem>库。

bool Flag = false;
string string_one = "/blah/blah/bhah1.ext";
string string_two = "/blah/blah/bhah2.ext";
//MSVC
namespace fs = std::experimental::filesystem;
//GCC or any other compiler which has moved filesystem out of the experimental namespace
//namespace fs = std::filesystem;
Flag = fs::exists(string_one) || fs::exists(string_two);

此代码不要求您实际打开文件,这可能有助于提高性能。