2017-04-05 14 views
-1

私はC++を初めてお使いです。既存のコードベースの一部に詰まっています。ここでは、2つのファイルが存在するかどうかを特定する必要があります。これらのいずれかが存在する場合、またはその両方が存在する場合は、フラグを設定する必要があります。複数のファイルが存在するか確認してください

スニペットは次のようになります。

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を2回使用していますか?

私はたぶん愚かな質問をします。前もって感謝します!

+1

ifstreamを別のストリーム(fs1とfs2)として使用しているため、ifstreamを2回使用することは問題にならないはずです。 –

+0

私は混乱しています。最初のファイルが存在する場合、フラグをfalseに設定してはなりません。 – Carcigenicate

+1

初期化時以外は 'フラグ'を '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; 
} 

これはtrueflagを設定します。いずれかが存在しない場合にフラグを設定する場合は、ifステートメントの式を無効にします。

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

このコードは、実際には、パフォーマンス上の理由のために良いかもしれファイルを開くためにあなたを必要としません。

関連する問題