Как проверить, является ли текстовый файл пустым или не существует в c ++? - PullRequest
0 голосов
/ 08 декабря 2018

Я написал метод, который принимает имя файла, проверяет, существует ли файл и имеет ли содержимое, затем перечитывает 6 чисел в файле в 6 int переменных и возвращает true.Если файл не существует или не имеет содержимого, он возвращает false.

Однако, когда я вызываю метод и передаю ему файл, который существует, он возвращает false.Я не уверен, где я ошибся.

Вот мой код:

bool readHSV(string the_file)
{
    if(ifstream(the_file)){
        fstream myfile(the_file, ios_base::in);
        myfile >> h_min >> h_max >> s_min >> s_max >> v_min >> v_max;
        cout << h_min << endl << h_max << endl << s_min << endl << s_max
        << endl << v_min << endl << v_max;
        getchar();
        return true;
    }
    return false;
}

Содержимое файла .txt, который я использую:

4
22
68
192
162
247

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Единственный способ, которым ваша функция может возвратить false, - это если ifstream(the_file) завершится неудачей, то есть не сможет открыть файл вообще, существует он или нет.Если файл существует, но ifstream по-прежнему не удается, дважды проверьте, что the_file содержит правильный путь и имя файла и что у вашего приложения есть права на доступ к файлу.

Обратите внимание, что вы открываете файл дваждыодин раз ifstream и снова fstream.Вам не нужно это делать.Вы должны открыть файл только один раз и вернуть true, если вы можете прочитать значения, которые вы хотите из него, например:

bool readHSV(const string &the_file)
{
    ifstream inFile(the_file);
    if (inFile >> h_min >> h_max >> s_min >> s_max >> v_min >> v_max)
    {
        cout << h_min << endl
             << h_max << endl
             << s_min << endl
             << s_max << endl
             << v_min << endl
             << v_max;
        getchar();
        return true;
    }
    return false;
}
0 голосов
/ 08 декабря 2018

Вы можете использовать <filesystem> так:

#include <filesystem>

namespace fs = std::filesystem; // for brevity

// ...

bool func(std::string const& filename)
{
    if(!fs::exists(filename) || fs::file_size(filename) == 0)
        return false;

    std::ifstream ifs(filename);

    if(!ifs)
        return false;

    // do stuff here with ifs

    return true;
}
...