c++ - 如何逐行打印文本文件并正确分隔?
问题描述
所以我是一个完整的 C++ 初学者,我的问题是没有得到我期望的输出。该程序应逐行打印出 Animals.txt 文件中的内容/数据,并且运行良好。我遇到的唯一问题是名称(鲍里斯、卡尔文、达斯蒂和埃迪)应该在“动物名称:”行旁边,但事实并非如此。我如何实现这一目标?
这是 Animals.txt 文件:
爱丽丝:蟒蛇:10323:1。
鲍里斯:公牛:23456:2。
卡尔文:猫:01320:3。
尘土飞扬:恐龙:00001:5。
埃迪:鹰:57429:4。
这是代码:
while (counter < maximumNumbersOfAnimal)
{
clinic.animal[counter].number = counter;
cout << "Animal Number: " << clinic.animal[counter].number << endl;
file.getline(animalInfo, size, ':');
clinic.animal[counter].name = animalInfo;
cout << "Animal Name: " << clinic.animal[counter].name << endl;
file.getline(animalInfo, size, ':');
clinic.animal[counter].type = animalInfo;
cout << "Animal Type: " << clinic.animal[counter].type << endl;
file.getline(animalInfo, size, ':');
clinic.animal[counter].registrationNumber = stoi(animalInfo);
cout << "Animal Registration Number: " << clinic.animal[counter].registrationNumber << endl;
file.getline(animalInfo, size, '.');
clinic.animal[counter].problemNumber = stoi(animalInfo);
cout << "Animal Problem Number: " << clinic.animal[counter].problemNumber << endl;
counter++;
}
这是输出:
动物编号:0
动物名称:爱丽丝
动物类型:蟒蛇
动物登记号:10323
动物问题编号:1
动物编号:1
动物名称:
鲍里斯
动物类型:公牛
动物登记号:23456
动物问题编号:2
动物编号:2
动物名称:
卡尔文
动物类型:猫
动物登记号:1320
动物问题编号:3
动物编号:3
动物名称:
尘土飞扬
动物类型:恐龙
动物登记号:1
动物问题编号:5
动物编号:4
动物名称:
埃迪
动物类型:鹰
动物登记号:57429
动物问题编号:4
我的期望:
动物编号:0
动物名称:爱丽丝
动物类型:蟒蛇
动物登记号:10323
动物问题编号:1
动物编号:1
动物名称:鲍里斯
动物类型:公牛
动物登记号:23456
动物问题编号:2
动物编号:2
动物名称:卡尔文
动物类型:猫
动物登记号:1320
动物问题编号:3
动物编号:3
动物名称:尘土飞扬
动物类型:恐龙
动物登记号:1
动物问题编号:5
动物编号:4
动物名称:埃迪
动物类型:鹰
动物登记号:57429
动物问题编号:4
解决方案
因为file.getline(animalInfo, size, '.');
指定了一个不同于默认换行符的分隔符,所以没有任何内容会删除Alice:Anaconda:10323:1'\n'
末尾的换行符。.
当鲍里斯:公牛:23456:2。被读取,file.getline(animalInfo, size, ':');
找到左边的换行符并将其animalInfo
与找到的所有其他内容一起放入 next ':'
。animalInfo
contains "\nBoris"
,并且在animalInfo
打印时换行符会完成其工作并插入新行,从而导致
动物名称:
鲍里斯
最简单的解决方案是在使用换行符之后插入file.ignore(numeric_limits<streamsize>::max(), '\n');
(注意<limits>
必须包括在内) 。file.getline(animalInfo, size, '.');
std::string
另一种方法是用 a将整行读入 a中std::getline
,将该行放在 a 中std::istringstream
,然后解析该stringstream
行的数据。这使得更容易检测错误并从错误中恢复。使用此答案的选项 2获取灵感。
不要忘记检查输入的有效性,并处理(可能丢弃)发现的任何无效条目,因为您阅读文件并添加一个简单的输出到
while (counter < maximumNumbersOfAnimal)
是否应该到达文件之前的结尾maximumNumbersOfAnimal
。否则你会发现程序正在录制垃圾。
推荐阅读
- python - 如何使用键盘和鼠标 Python 模块将用户输入(键盘、鼠标)正确存储在文件中?
- python - 已解决:为每个脚本选择不同的 python 解释器
- atom-editor - 更改 Atom 中的 config.settings 后如何刷新包?(init.coffee 脚本)
- kubernetes - 如何让 de pods 处于运行状态
- reactjs - 从项目中为导入的组件反应组件环境变量
- c++ - 存储 std::list 元素的地址;记忆
- javascript - 如何在毒性分类器中添加更多单词
- python - 如何识别 numpy.ndarray 中的“PNG(便携式网络图形)”文件?
- excel - 在#vba 中使用转置将数据从一个选项卡传输(复制和粘贴)到另一个选项卡
- c# - 当我启动 asp.net 应用程序时,IIS Express 会启动正在运行的站点的副本