Правильная идиома для чтения файла построчно в C ++ использует такой цикл:
for (std::string line; std::getline(file,line);)
{
// process line.
}
Вставка этого в ваш пример (+ исправление отступов и имен переменных) дает что-то вроде этого:
int countlines(const std::string& path)
{
// Open the file.
std::ifstream file(path.c_str());
if (!file.is_open()) {
return -1; // or better, throw exception.
}
// Count the lines.
int count = 0;
for (std::string line; std::getline(file,line);)
{
if (!line.empty()) {
++count;
}
}
return count;
}
Обратите внимание: если вы не собираетесь обрабатывать содержимое строки, вы можете пропустить их обработку, используя std::streambuf_iterator
, что может сделать ваш код похожим на:
int countlines(const std::string& path)
{
// Open the file.
std::ifstream file(path.c_str());
if (!file.is_open()) {
return -1; // or better, throw exception.
}
// Refer to the beginning and end of the file with
// iterators that process the file character by character.
std::istreambuf_iterator<char> current(file);
const std::istreambuf_iterator<char> end;
// Count the number of newline characters.
return std::count(current, end, '\n');
}
Вторая версия полностью обойдет копирование содержимого файла и позволит избежать выделения больших кусков памяти для длинных строк.