sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-02 17:18:50 29 4
mua khóa gpt4 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.

1 Câu trả lời

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

流本身有一个状态,用于确定流是否良好并且可以读取或写入,或者是否发生流错误以防止进一步的 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 状态更改都将在返回时可用。因此,如果在 đọc 函数中遇到 eof,则状态更改将在返回时可用。对于您的 in 函数也是如此(尽管会更改流的潜在错误更少且不同)

hiện hữu đọc 中,您从流中读取 3 条信息:item.bookNo、item.units_soldgiá 并更新item.revenue:

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

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

print 函数则相反,它输出 item.isbn()、item.units_sold、item.revenue 的返回值以及 item.avg_price() 的返回值> 作为输出。如果将 std::cout BẰNG hệ điều hành

chuyển khoản

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

过于简化的示例

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

#include 

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

然后,我们简化đọc,仅读取bookno、units_soldgiá ,并计算其收入单个项目,例如

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;
}

并简化in以仅输出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_soldgiá 如何读取in 函数的工作原理,以及其中一个函数中发生的错误如何改变流状态。一个简短的 chủ yếu() 可能是:

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 */
khác
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/

29 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com