首页 > 解决方案 > 如何逐行打印文本文件并正确分隔?

问题描述

所以我是一个完整的 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

标签: c++

解决方案


因为file.getline(animalInfo, size, '.');指定了一个不同于默认换行符的分隔符,所以没有任何内容会删除Alice:Anaconda:10323:1'\n'末尾的换行符。.

鲍里斯:公牛:23456:2。被读取,file.getline(animalInfo, size, ':');找到左边的换行符并将其animalInfo与找到的所有其他内容一起放入 next ':'animalInfocontains "\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。否则你会发现程序正在录制垃圾。


推荐阅读