2017-04-05 123 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); 

此代碼不要求實際開放的文件,這可能是良好的性能的原因。