2017-04-05 118 views
-1

我是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工作正常和标志的价值没有得到改变(仍false )。但是,如果string_two也存在,则不知何故Flag的值将设置为true。 Ran调试器,最后发现控制器正在进入if ((bool)fs2 == false)

是因为两次使用std::ifstream

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

+1

。 –

+0

我很困惑。如果第一个文件存在,标志应该*不*设置为false。 – Carcigenicate

+1

除了初始化之外,您只能将'Flag'设置为'true'。所以如果任何一个文件存在,“Flag”将是“true”。你从来没有在任何if中将'Flag'设置为'false',这与你的陈述相反*“第一个if如果工作正常并且flag设置为false”* –

回答

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; 
} 

这将设置flagtrue如果任何一个成功打开阅读。如果您想要设置标志(如果不存在),只需否定if语句中的表达式即可。你也可以做以下的(如上面的评论中提到您的问题):使用ifstream的两倍,因为它们是不同的流(FS1和FS2)不应该是一个问题

flag = !fs1 || !fs2; 
+0

谢谢!如果**我想设置标志,如果(或两个)文件都不存在**,那么它会起作用吗? 'if(!fs1 ||!fs2)' – Nuke

+0

是的。我会更新我的答案。 – RyanL

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); 

此代码不要求实际开放的文件,这可能是良好的性能的原因。