gpt4 book ai didi

c++ - 使用 istream 参数读取的 istream 函数

转载 作者:行者123 更新时间:2023-12-02 17:18:50 28 4
gpt4 key购买 nike

我正在尝试理解这段代码

istream &read(istream &is, Sales_data &item) 
{
double price = 0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = price * item.units_sold;
return is;
}

ostream &print(ostream &os, const Sales_data &item)
{
os << item.isbn() << " " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}

我不明白这些函数是什么,也不明白为什么我们使用 istream 进行读取,使用 ostream 进行打印,而不是使用 cin cout

最佳答案

为了理解 readprint 函数中发生的情况,您需要了解一些微妙之处。从概述的角度来看,istreamostream 是通用输入和输出类,为 C++ 中的流 I/O 提供基础。正如其他答案和评论正确指出的那样, std::cinstd::cout 源自 istreamostream code> 提供来自标准流 stdinstdout 的输入/输出。

流本身有一个状态,用于确定流是否良好并且可以读取或写入,或者是否发生流错误以防止进一步的 I/O(有些故障可以恢复,有些则不能)请参阅 std::basic_ios::rdstatestd::basic_ios::setstate有关构成流状态的位(goodbit、badbit、failbit、eofbit)的讨论。

现在看看你的函数原型(prototype):

istream &read(istream &is, Sales_data &item)

ostream &print(ostream &os, const Sales_data &item)

注意第一个参数是对当前流的引用吗?并注意返回如何也是对同一流的引用吗?这很重要,因为它传递了对流的引用,因此函数内发生的任何 Steam 状态更改都将在返回时可用。因此,如果在 read 函数中遇到 eof,则状态更改将在返回时可用。对于您的 print 函数也是如此(尽管会更改流的潜在错误更少且不同)

read 中,您从流中读取 3 条信息:item.bookNo、item.units_soldprice 并更新item.revenue:

is >> item.bookNo >> item.units_sold >> price; 
item.revenue = price * item.units_sold;

您可以通过将其作为 is 的参数传递来读取 std::cin ,也可以传递一个打开的文件流。流操作适用于任何有效的流。

print 函数则相反,它输出 item.isbn()、item.units_sold、item.revenue 的返回值以及 item.avg_price() 的返回值> 作为输出。如果将 std::cout 作为 os

传递

两个函数中的最后一个命令都会返回流,包括流状态中的任何更改,以便调用者可以检查读取还是打印那是成功的。这是调用者能够确定 I/O 是否发生的关键。

过于简化的示例

一个过度简化的示例来练习该函数可能有助于理解概念。这里我们声明一个简化的结构体Sales_data,其中包含int bookno,units_sold;doubleprice ,收入; 例如:

#include <iostream>

struct Sales_data
{
int bookno, units_sold;
double price, revenue;
};

然后,我们简化read,仅读取bookno、units_soldprice,并计算其收入单个项目,例如

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收入:

std::ostream &print(std::ostream &os, const Sales_data &item)
{
os << "units sold: " << item.units_sold << " revenue: $" << item.revenue << '\n';

return os;
}

现在您可以看到以一种非常简单的方式提示用户输入bookno、units_soldprice如何读取print 函数的工作原理,以及其中一个函数中发生的错误如何改变流状态。一个简短的 main() 可能是:

int main (void) {

Sales_data sd;

std::cout << "enter bookno units_sold price: ";

if (read (std::cin, sd)) /* if read succeeds */
print (std::cout, sd); /* print data */
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

希望讨论和示例有助于澄清这个概念。如果您还有其他问题,请告诉我。

关于c++ - 使用 istream 参数读取的 istream 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60255516/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com