c++ - (C++) 为什么不计算文本文件中的额外空行?
问题描述
我创建了这个函数来返回文本文件中的行数:
int numberOfLinesInFile(string dataFile){
ifstream inputFile;
inputFile.open("data.txt");
int numberOfLines, data;
while(!inputFile.eof()){
inputFile >> data;
numberOfLines++;
}
cout << "Number of lines: " << numberOfLines << endl;
inputFile.close();
return numberOfLines;
}
我注意到的一件有趣的事情是,该函数正确计算了非空行的数量(以及末尾的额外空行),但未计算额外的空行。例如,如果这是我的文件:
234
453
657
然后函数返回4
,因为文本文件中有四行。但是,如果我的文件末尾包含多个空行:
234
453
657
函数4
再次返回。
为什么会这样?这和eof
指令有关系吗?
编辑:
好的,谢谢@MikeCAT 让我明白问题出在哪里。根据@MikeCAT 的回答,我将while
循环更改为:
while(!inputFile.eof()){
if(inputFile >> data)
numberOfLines++;
else{
cout << "Error while reading line " << numberOfLines + 1 << "!" << endl;
}
}
numberOfLines
我在没有确保实际读取该行的情况下递增。
解决方案
首先,您numberOfLines++;
在inputFile >> data;
不检查读取是否成功的情况下进行操作。这很糟糕,并导致额外的计数。
其次,inputFile >> data;
读取整数并在整数之前跳过空白字符。
为避免这些问题,您应该使用std::getline()
计数行。
也不要忘记初始化numberOfLines
.
int numberOfLinesInFile(string dataFile){
ifstream inputFile;
inputFile.open("data.txt");
int numberOfLines = 0;
std::string data;
while(std::getline(inputFile, data)){
numberOfLines++;
}
cout << "Number of lines: " << numberOfLines << endl;
inputFile.close();
return numberOfLines;
}
推荐阅读
- android - 在这个 Flutter 示例中格式化文本的最佳方式是什么?
- python-3.x - 如何用 Marshmallow 序列化嵌套字典?
- javascript - 如何在 css 图像上添加图像扩展名?
- glib - 如何释放 GSettings 使用的资源?
- node.js - 在 NestJS CQRS 配方中处理“事件溯源”的首选方式
- css - 显示弹性宽度的问题
- java - 通过意图保存两个活动之间的状态
- bittorrent - 如何启动对话框以从另一个程序打开一个程序?
- python - 用 PCA 和 SVD 计算的不同阶的特征值
- javascript - 如何使用 2 个数组创建具有键和值的新数组?