объект std :: filesystem :: path вызывает исключение при его передаче в std :: cout - PullRequest
0 голосов
/ 04 мая 2020

У меня есть программа lines, которая предназначена для подсчета количества строк в исходных файлах в каталоге.

Для путей к файлам я использую std::filesystem::path.

Когда путь значение объекта печатается с использованием std::cout и std::filesystem::path::string(), оно выдает std::invalid_exception. но согласно string () документации на cppreference.com, он не должен выдавать никаких исключений.

Соответствующие фрагменты кода приведены ниже:

#ifdef _DEBUG

#define LINES_DEBUG

#endif

#ifdef LINES_DEBUG

#define REPLACE(x)          x

#else

#define REPLACE(x)

#endif

#define LOG(x)              REPLACE(((std::cout << __LINE__ << " " << __func__ << " " )<< x) << "\n")

namespace fs = std::filesystem;

using fs::path;

//struct for pairing line count with comments and without comments
struct LineCount
{
    path component;

    // total line count
    unsigned long long total = 0;

    //comment and whitespace stripped count
    unsigned long long stripped = 0;

    inline LineCount& operator += (LineCount other)
    {
        total += other.total;
        stripped += other.stripped;
        return *this;
    }
};

void count_file_lines(LineCount& count)
{
    if (count.component.empty())
        throw std::invalid_argument("empty path");
    if (!fs::is_directory(count.component))
        throw std::invalid_argument("argument must be directory");
    LOG(count.component.string());    // exception is thrown here
    std::ifstream file(count.component);

    std::string input;
    bool comment = false;
    std::getline(file, input);
    while (!file.eof())
    {
        comment = check_string(input, count, comment);
        std::getline(file, input);
    }
    LOG(count.total << " " << count.stripped);
}

Примечание : Все эти функции существуют в пространстве имен, как и директивы using.

Примечание : Это мой проект с открытым исходным кодом, см. ветвь функций или хранилище

...