我是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
两次?
答案 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);
此代码不要求您实际打开文件,这可能有助于提高性能。