要理解在
read
和
print
函数中发生了什么,您需要理解一些微妙的细节。从概述的角度来看,
istream
和
ostream
是通用的输入和输出类,为C++中的流I/O提供了基础。正如其他答案和评论正确指出的那样,
std::cin
和
std::cout
派生自
istream
和
ostream
,以提供对标准流
stdin
和
stdout
的输入/输出。
这些流本身具有状态,该状态确定流是否良好并且可以读取或写入,或者是否发生了流错误,从而防止进一步的I/O操作(某些故障是可恢复的,某些则不是)。请参见
std::basic_ios :: rdstate 和
std::basic_ios :: setstate 以获取有关组成流状态的位(< code> goodbit,badbit,failbit,eofbit )的讨论。
现在看看您的函数原型:
istream &read(istream &is, Sales_data &item)
并且
ostream &print(ostream &os, const Sales_data &item)
请注意第一个参数是当前流的引用,返回值也是对同一流的引用。这很重要,因为它传递了对流的引用,所以函数内发生的任何对
Steam State的更改都将在返回时可用。因此,如果在
read
函数中遇到
eof
,则状态的更改将在返回时可用。对于您的
print
函数也是如此(尽管可能会更改流的潜在错误较少且不同)。
在
read
中,您正在从流中读取3个信息:
item.bookNo、item.units_sold
和
price
,并更新
item.revenue
:
is >> item.bookNo >> item.units_sold >> price;
item.revenue = price * item.units_sold;
你可以通过将
std::cin
作为
is
的参数传递来从中读取内容,或者你可以传递一个打开的文件流。流操作将适用于任何有效的流。
print函数的作用与之相反,它输出
item.isbn()、item.units_sold、item.revenue
以及
item.avg_price()
的返回值作为输出。如果将
std::cout
作为
os
传递。
两个函数中的最后一个命令返回包括流状态更改在内的流,因此调用者可以检查
read
或
print
是否成功。这对于调用者能够确定I/O是否发生非常关键。
过度简化的示例可能有助于理解这些概念。在这里,我们声明了一个简化的结构体
Sales_data
,其中包含
int bookno, units_sold;
和
double price, revenue;
等元素。例如:
#include <iostream>
struct Sales_data
{
int bookno, units_sold;
double price, revenue;
};
我们将简化
read
函数,仅读取
bookno, units_sold
和
price
这三个参数,并计算单个项目的
revenue
,例如:
std::istream &read(std::istream &is, Sales_data &item)
{
is >> item.bookno >> item.units_sold >> item.price;
item.revenue = item.price * item.units_sold;
return is;
}
简化 print
函数,只输出 units_sold
和 revenue
:
std::ostream &print(std::ostream &os, const Sales_data &item)
{
os << "units sold: " << item.units_sold << " revenue: $" << item.revenue << '\n';
return os;
}
现在您可以非常简单地提示用户输入bookno、units_sold
和price
,以展示read
和print
函数的工作方式,以及一个函数内部发生错误如何改变流状态。下面是一个简短的main()
函数:
int main (void) {
Sales_data sd;
std::cout << "enter bookno units_sold price: ";
if (read (std::cin, sd))
print (std::cout, sd);
else
std::cerr << "error: invalid input\n";
}
示例使用/输出
$ ./bin/readprintstream
enter bookno units_sold price: 12 100 12.95
units sold: 100 revenue: $1295
或者发生错误时:
$ ./bin/readprintstream
enter bookno units_sold price: 23 banannas 12.28
error: invalid input
希望这次讨论和示例能够帮助您更好地理解这个概念。如果您有进一步的问题,请告诉我。