读取文件中信息,包括动态字符串数组,C++premier plus的一道课后题

心态与习惯
领域专家: 人工智能技术领域
2014-04-02 12:05:30
该文件的第一项为捐款人数,余下的内容应为成对的行。在每一对中,第一行为捐款人姓名,第二行为捐款数额。即该文件类似于下面:
4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000
假设该文件为“123.txt”
读取该文件信息,并按捐款额是否大于15000分成两类输出
...全文
149 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
JiMoKuangXiangQu 2014-04-02
  • 打赏
  • 举报
回复
引用 楼主 robert_chen1988 的回复:
该文件的第一项为捐款人数,余下的内容应为成对的行。在每一对中,第一行为捐款人姓名,第二行为捐款数额。即该文件类似于下面: 4 Sam Stone 2000 Freida Flass 100500 Tammy Tubbs 5000 Rich Raptor 55000 假设该文件为“123.txt” 读取该文件信息,并按捐款额是否大于15000分成两类输出
#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;


class DonorInfo {
	friend istream& operator>>(istream&, DonorInfo&);
	friend ostream& operator<<(ostream&, const DonorInfo&);

public:
	DonorInfo() : m_name(""), m_numOfDonations(0UL) { }

	unsigned long getDonation() const { return m_numOfDonations; }

private:
	string m_name;
	unsigned long m_numOfDonations;
};

istream& operator>>(istream& is, DonorInfo& donorInfo)
{
	string garbage;
	getline(is, garbage);

	getline(is, donorInfo.m_name);
	is >> donorInfo.m_numOfDonations;

	return is;
}

ostream& operator<<(ostream& os, const DonorInfo& donorInfo)
{
	os << donorInfo.m_name << ": " << donorInfo.m_numOfDonations;
	return os;
}


class DonorDB {
	friend ostream& operator<<(ostream&, const DonorDB&);

public:
	DonorDB(istream& is) {
		is >> m_numOfDonors;

		DonorInfo donorInfo;
		while (is >> donorInfo) {
			if (donorInfo.getDonation() <= 15000)
				m_donorsA.push_back(donorInfo);
			else
				m_donorsB.push_back(donorInfo);
		}
	}

private:
	unsigned int m_numOfDonors;
	vector<DonorInfo> m_donorsA, m_donorsB;
};

ostream& operator<<(ostream& os, const DonorDB& donorDB)
{
	os << donorDB.m_numOfDonors << endl;

	cout << endl << "Donors A( <= 15000): " << endl;
	for (vector<DonorInfo>::const_iterator it = donorDB.m_donorsA.begin(); 
		 it != donorDB.m_donorsA.end(); ++it)
		 os << *it << endl;

	cout << endl << "DonorsB( > 15000): " << endl;
	for (vector<DonorInfo>::const_iterator it = donorDB.m_donorsB.begin(); 
		 it != donorDB.m_donorsB.end(); ++it)
		 os << *it << endl;

	return os;
}



int main()
{
	ifstream ifile("123.txt");
	DonorDB donorDB(ifile);
	cout << donorDB;
	ifile.close();

	cin.get();
	return 0;
}
仅简单的完成逻辑,没有做错误检测等等,仅供参考,也未必满足LZ的限制条件。 Input(123.txt):
4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000
Ouput(console):
4

Donors A( <= 15000):
Sam Stone: 2000
Tammy Tubbs: 5000

DonorsB( > 15000):
Freida Flass: 100500
Rich Raptor: 55000
心态与习惯 2014-04-02
  • 打赏
  • 举报
回复
这个章节还没学到map容器,需用别的手段了
心态与习惯 2014-04-02
  • 打赏
  • 举报
回复
引用 3 楼 JiMoKuangXiangQu 的回复:
[quote=引用 楼主 robert_chen1988 的回复:] 该文件的第一项为捐款人数,余下的内容应为成对的行。在每一对中,第一行为捐款人姓名,第二行为捐款数额。即该文件类似于下面: 4 Sam Stone 2000 Freida Flass 100500 Tammy Tubbs 5000 Rich Raptor 55000 假设该文件为“123.txt” 读取该文件信息,并按捐款额是否大于15000分成两类输出
#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;


class DonorInfo {
	friend istream& operator>>(istream&, DonorInfo&);
	friend ostream& operator<<(ostream&, const DonorInfo&);

public:
	DonorInfo() : m_name(""), m_numOfDonations(0UL) { }

	unsigned long getDonation() const { return m_numOfDonations; }

private:
	string m_name;
	unsigned long m_numOfDonations;
};

istream& operator>>(istream& is, DonorInfo& donorInfo)
{
	string garbage;
	getline(is, garbage);

	getline(is, donorInfo.m_name);
	is >> donorInfo.m_numOfDonations;

	return is;
}

ostream& operator<<(ostream& os, const DonorInfo& donorInfo)
{
	os << donorInfo.m_name << ": " << donorInfo.m_numOfDonations;
	return os;
}


class DonorDB {
	friend ostream& operator<<(ostream&, const DonorDB&);

public:
	DonorDB(istream& is) {
		is >> m_numOfDonors;

		DonorInfo donorInfo;
		while (is >> donorInfo) {
			if (donorInfo.getDonation() <= 15000)
				m_donorsA.push_back(donorInfo);
			else
				m_donorsB.push_back(donorInfo);
		}
	}

private:
	unsigned int m_numOfDonors;
	vector<DonorInfo> m_donorsA, m_donorsB;
};

ostream& operator<<(ostream& os, const DonorDB& donorDB)
{
	os << donorDB.m_numOfDonors << endl;

	cout << endl << "Donors A( <= 15000): " << endl;
	for (vector<DonorInfo>::const_iterator it = donorDB.m_donorsA.begin(); 
		 it != donorDB.m_donorsA.end(); ++it)
		 os << *it << endl;

	cout << endl << "DonorsB( > 15000): " << endl;
	for (vector<DonorInfo>::const_iterator it = donorDB.m_donorsB.begin(); 
		 it != donorDB.m_donorsB.end(); ++it)
		 os << *it << endl;

	return os;
}



int main()
{
	ifstream ifile("123.txt");
	DonorDB donorDB(ifile);
	cout << donorDB;
	ifile.close();

	cin.get();
	return 0;
}
仅简单的完成逻辑,没有做错误检测等等,仅供参考,也未必满足LZ的限制条件。 Input(123.txt):
4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000
Ouput(console):
4

Donors A( <= 15000):
Sam Stone: 2000
Tammy Tubbs: 5000

DonorsB( > 15000):
Freida Flass: 100500
Rich Raptor: 55000
[/quote]赞一个,但这个章节还没接触到类呢
荔枝树_12w 2014-04-02
  • 打赏
  • 举报
回复
用两个map容器,分别存储大于或小于的人,然后遍历容器输出。

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧