Проверьте, существует ли данный множественный файл
Я новичок в 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
, Запустил отладчик и обнаружил, что управление идет внутрь if ( (bool)fs2 == false )
наконец.
Это из-за использования std::ifstream
дважды?
Я, возможно, задаю глупый вопрос. Заранее спасибо!
2 ответа
В своем посте вы говорите, что хотите установить флаг, если существует один или оба файла. Ваш текущий код устанавливает флаг, если они не существуют (их нельзя открыть для чтения). Попробуйте что-то вроде этого:
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;
Если ваш компилятор совместим с 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);
Этот код не требует от вас фактического открытия файлов, что может быть полезно по соображениям производительности.