所以我是C ++的完整入门者,我的问题不是得到我期望的输出。该程序应逐行打印Animals.txt文件中的内容/数据,并且效果很好。我唯一遇到的问题是名称(鲍里斯,加尔文,达斯蒂和埃迪)应该在“动物名称:”行的旁边,但事实并非如此。我该如何实现?
这是Animals.txt文件:
Alice:Anaconda:10323:1。
鲍里斯(Boris):牛:23456:2。
加尔文:猫:01320:3。
尘土飞扬:恐龙:00001:5。
Eddie:Eagle: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
动物名:
Eddie
动物类型:鹰
动物注册号:57429
动物问题编号:4
我的期望:
动物数:0
动物名:爱丽丝
动物类型:水蟒
动物注册号:10323
动物问题编号:1
动物数:1
动物名:鲍里斯
动物类型:公牛
动物注册号:23456
动物问题编号:2
动物数:2
动物名:加尔文(Calvin)
动物类型:猫
动物注册号:1320
动物问题编号:3
动物数:3
动物名:尘土飞扬
动物类型:恐龙
动物注册号:1
动物问题编号:5
动物数:4
动物名:Eddie
动物类型:鹰
动物注册号:57429
动物问题编号:4
答案 0 :(得分:1)
由于file.getline(animalInfo, size, '.');
指定的分隔符与换行符的默认值'\n'
不同,因此在 Alice:Anaconda:10323:1。的末尾没有任何内容可删除换行符。
读取 Boris:Bull:23456:2。时,file.getline(animalInfo, size, ':');
找到左边的换行符,并将其与找到的所有其他内容一起放入animalInfo
中。下一个':'
。 animalInfo
包含"\nBoris"
,并且在打印animalInfo
时,换行符执行其工作并插入新行,从而导致
动物名:
鲍里斯
最简单的解决方案是在file.ignore(numeric_limits<streamsize>::max(), '\n');
之后放入<limits>
(注意必须包含file.getline(animalInfo, size, '.');
)以使用换行符。
另一种方法是将整行读入带有std::string
的{{1}},将行放在std::getline
中,然后解析std::istringstream
以获取该行的价值数据。这使得更容易发现错误并从错误中恢复。 Use Option 2 of this answer寻求灵感。
别忘了检查输入的有效性,并处理(可能会丢弃)发现的无效条目,同时阅读文件并为
添加简单易用的内容stringstream
文件应在到达while (counter < maximumNumbersOfAnimal)
之前结束。否则,您会发现该程序正在记录垃圾。