如何在while(cin>>str)跳出循环后能继续执行程序中其他的输入操作

来源:互联网 发布:拍婚纱照 知乎 编辑:程序博客网 时间:2024/06/07 15:41

今天在编写一个处理书店数据得小程序时遇到了一个问题。


程序中定义了sales_data类,也重载了符号>>

sales_data book;
sales_data trans1, trans2;
cout << "请输入销售记录(包含ISBN、销售本数、原始价格、实售价格):" << endl;
while (cin >> book)
{
cout << "ISBN、售出本数、原始价格、实售价格、折扣为:" << book << endl;

}

cout << "请输入两条ISBN相同的销售记录:" << endl;
cin >> trans1;
cin>> trans2;

上述语句期望实现的功能是:①用户通过键盘不断输入销售记录,在输入结束后系统可以打印出相关销售记录的信息

                                                    ②信息打印后用户可以继续输入两条ISBN相同的销售记录然后程序继续进行判断。

我们都知道输入流对象cin输入的结束符在windows下是ctrl+z;于是乎

请输入销售记录(包含ISBN、销售本数、原始价格、实售价格):
021 2 20 16
ISBN、售出本数、原始价格、实售价格、折扣为:021     2   20   16    0.8
021 3 20 15
ISBN、售出本数、原始价格、实售价格、折扣为:021     3   20   15    0.75
^Z
请输入两条ISBN相同的销售记录:
汇总信息:ISBN、售出本数、原始价格、实售价格、折扣为     0   0   -1.#IND    0
请输入几条ISBN相同的销售记录:
没有数据
请按任意键继续. . .

通过程序运行的情况我们不难发现,虽然输入ctrl+z使程序跳出了while(cin>>book)的循环,但是它并不能继续执行循环外的输入操作也就是直接退出了程序。

//

//

那这是为什么呢?

要理清这件事首先我们要对了解的处理机制,cin遇到ctrl+z便认为输入结束,也就是不再接受键盘的输入(但是它会读取缓冲区已经存在的数据),

但是ctrl+z还是会留在缓冲区内!!!!!!

也就是说当我们输入换行+(ctrl+z)+换行后。程序跳出while循环,但是ctrl+z还在缓冲区内,当程序继续执行到 

cout << "请输入两条ISBN相同的销售记录:" << endl;
cin >> trans1;
cin>> trans2;

时,当cin再去读的时候,发现缓冲区存在ctrl+z(上次跳出循环遗留下的),于是它就走了,也就是啥都没读到。所以用户也无法输入。

//

//

//

解决方法很简单

就是及时清除缓冲区

也就是在程序跳出循环后利用函数

cin.clear();
cin.ignore();

然后就OK了

sales_data book;
sales_data trans1, trans2;
cout << "请输入销售记录(包含ISBN、销售本数、原始价格、实售价格):" << endl;
while (cin >> book)
{
cout << "ISBN、售出本数、原始价格、实售价格、折扣为:" << book << endl;

}
cin.clear();
cin.ignore();
cout << "请输入两条ISBN相同的销售记录:" << endl;
cin >> trans1;
cin>> trans2;
if (compareIsbn(trans1, trans2))//两条记录相同则进行的操作
{
cout << "汇总信息:ISBN、售出本数、原始价格、实售价格、折扣为" << trans1 + trans2 << endl;
//计算卖出的本数和平均价格及折扣
}
else
cout << "两条销售的ISBN记录不同" << endl;

结果如下:

请输入销售记录(包含ISBN、销售本数、原始价格、实售价格):
021 2 20 16
ISBN、售出本数、原始价格、实售价格、折扣为:021     2   20   16    0.8
021 3 20 15
ISBN、售出本数、原始价格、实售价格、折扣为:021     3   20   15    0.75
^Z


请输入两条ISBN相同的销售记录:
021 2 20 16
021 3 20 16
汇总信息:ISBN、售出本数、原始价格、实售价格、折扣为021     5   20   16    0.8
请输入几条ISBN相同的销售记录:
021 2 20 16
021 3 10 5
^Z
有效汇总信息:ISBN、售出本数、原始价格、实售价格、折扣为:021     5   20   11.875
    0.59375


请输入若干销售记录:
021 2
^Z
没有数据
请按任意键继续. . .


用户可以接续输入数据了~

1 0
原创粉丝点击