从文件中读取数据,动态分配结构数组,然后根据捐款金额分类。。
~~遇到字母与数字的交叉时,一定要注意cin.get()的使用!!!!!
//P201 课后程序练习9
//从文件读入数据+分类存放+infile.get()陷阱
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;
const int SIZE=30;
struct donation
{
string name;
double money;
};
int main()
{
ifstream infile;
char filename[SIZE];
cout<<"Enter name of file: ";
cin.getline(filename,SIZE);
infile.open(filename);
if (!infile.is_open())
{
cout<<"Could not open the file"<<filename<<endl;
cout<<"Program terminating.\n";
exit(EXIT_FAILURE);
}
<pre name="code" class="cpp"> int number;
infile>>number;
<span style="color:#ff0000;">infile.get();</span>
donation *members=new donation[number];
cout<<endl<<"Grand Patrons: \n";
for (int k=0;k<number;++k){getline(infile,members[k].name);infile>>members[k].money; infile.get();}int count1=0;for (int j=0;j<number;++j){if (members[j].money>10000){++count1;cout<<members[j].name<<"\t"<<members[j].money<<endl;}}if (count1==0) cout<<"none.\n";cout<<endl<<"Patrons: \n";int count2=0;for (int j=0;j<number;++j){if (members[j].money<=10000){++count2;cout<<members[j].name<<"\t"<<members[j].money<<endl;}}if (count2==0) cout<<"none.\n";delete [] members;infile.close();system("pause");return 0;}
</pre><p></p><p>filename :</p><p>4<br />Sam Stone<br />20000<br />Freida Flass<br />100500<br />Tammy Tubbs<br />50000<br />Rich Raptor<br />55000</p><p>~~~~~~~~~~~~~</p><p>第一次忘记cin.get()是在人数4到Sam之间。</p><p></p><pre name="code" class="cpp"> int number;
infile>>number;
infile.get();
donation *members=new donation[number];
cout<<endl<<"Grand Patrons: \n";
第二次忘记cin.get()是在金额与姓名之前。
for (int k=0;k<number;++k)
{
getline(infile,members[k].name);
infile>>members[k].money;
infile.get();
~~~~~~~~~~~~~~~~
养成 open ,close; new ,delete好习惯
cin.get
getline
cin.getline
cin
输入缓存。
~~~~~~~~~~~~~~~~~
cin.get()是保留回车在输入流队列中的.而cin是丢弃回车的.
也就是说,
cin自动跳过输入的空格,如果你要把键盘上输入的每个字符 包括空格和回车键都作为一个输入字符给字符型变量时,必须使用函数cin.get()。
有时,可用cin来避开cin.get()问题。
cin.getline()按行读取。char字符串时:(name,SIZE);string时:getline(cin,str)。