У меня есть программа 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
.
Примечание : Это мой проект с открытым исходным кодом, см. ветвь функций или хранилище