Проверьте, существует ли данный множественный файл

Я новичок в 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);

Этот код не требует от вас фактического открытия файлов, что может быть полезно по соображениям производительности.

Другие вопросы по тегам