如何逐行打印文本文件并正确分开?

时间:2019-03-30 06:42:42

标签: c++

所以我是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

1 个答案:

答案 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) 之前结束。否则,您会发现该程序正在记录垃圾。