有很多问题涉及计算文件中的行数。我已根据this question中的建议使用std::count
成功实施了此功能。
我目前面临的挑战是,在处理文件时我需要具备一定的稳健性 - 其中一些文件最后可能会有一个空行,有时则可能没有。某些文件具有UNIX行结尾,其他文件具有Windows行结尾。
我试过寻找一个' \ n'在距离输入流末尾的偏移量为-1的情况下,但这并未成功。代码看起来像这样:
std::ios::pos_type current_location = is_->tellg();
is_->seekg(0);
auto saved_flags = is_->flags();
uint64_t total_records(0);
total_records = std::count(std::istreambuf_iterator<char>(*is_),
std::istreambuf_iterator<char>(), '\n');
// Check that the last character before the end of the file is not a '\n'
is_->seekg(-1,std::ios_base::end);
if (is_->peek() == '\n')
total_records--;
// restore the saved position and flags
is_->seekg(current_location);
is_->flags(saved_flags);
return total_records ? ++total_records : 0;
但是,这不起作用 - 计数不会被1减去,所以这个函数返回一个带有1个数字太多记录的计数。
显然,如果我可以强制要求所有文件都必须有一个尾随换行符或者必须没有尾随换行符,这是一个微不足道的问题。我觉得允许这两种可能性不应该 很难,而且我在这里遗漏了一些明显的东西。
更新 仅作为澄清问题,这是不一个家庭作业问题。这是我一直在做的个人项目。
非常感谢任何帮助。
Thanks- Shmuel