在 C++ 中存储输入数据的对象“cin”的数据成员的名称是什么?

What is the name of the data member of an object "cin" which stores an input data in C++?

提问人:Thang Tons 提问时间:10/3/2023 最后编辑:273KThang Tons 更新时间:10/3/2023 访问量:87

问:

例如。cin>>var; 对象 cin 从用户那里读取输入数据,一旦按下 ENTER 键,操作员“>>”就会提取 cin 的内容并存储到特定变量“var”中。这意味着输入数据首先存储在 cin 对象中。

现在,如果 cin 存储数据,那么我很想知道输入的数据将存储到 cin 对象的哪个 MEMBER DATA???例如。cin.memberdataname 或 cin.xxxx 等??最初存储输入数据的成员数据的名称是什么?

C++ 缓冲区 CIN

评论

2赞 273K 10/3/2023
std::cin不存储任何数据,它是无缓冲的,终端窗口在按下 Enter 后发送输入数据。
0赞 Thang Tons 10/3/2023
终端窗口是什么意思?你能用通俗易懂的语言🙏解释一下吗?
1赞 Pepijn Kramer 10/3/2023
std::cin 在内部如何做事完全取决于实现。但通常它涉及一个(循环)内存缓冲区,并且通常对该缓冲区的访问非常有限。您是否阅读了 basic_ios::rdbuf 上的文档?通常最好先咨询 cppreferences,然后再提出问题;)
1赞 Remy Lebeau 10/3/2023
cin不存储任何数据。它有一个关联的对象,cin 的默认对象从您键入的终端窗口读取和缓冲数据。然后从 .这是流在 C++ 中工作方式的基础,因为可以在不改变运算符使用流的方式的情况下交换流streambufstreambufoperator>>streambuf
0赞 john 10/3/2023
输入数据存储在某个地方是对的,但认为它必须存储在对象中是错误的。C++ 不指定此数据的存储位置。cin

答:

-1赞 Molnár Levente 10/3/2023 #1

如果 CIN 存储数据

不,它不存储数据。它将标准输入流链接到内存地址。标准输入不一定是键盘,因为 txt 文件可以用作输入,但 cin 代表控制台输入,它真正做的是获取操作系统的控制台界面,该界面与键盘绑定并将应用程序绑定在链上。测试这一点的一种方法是检查应用程序的汇编代码,您只会看到一个变量,即“var”。但是,除了使用 cin 之外,还有其他方法可以获取输入,但这是另一个问题,如果你是那个好奇心。

评论

0赞 Sven 10/5/2023
如果您不理解该问题,请在提供答案之前要求澄清,然后无法回答该问题。
0赞 Molnár Levente 10/6/2023
对不起,造成了创伤。我相信,这种理解和回答唐的问题的努力是令人满意的,如果有人想从不同的角度看待它,他们是自由的,并鼓励他们这样做。
1赞 Miles Budnek 10/3/2023 #2

C++ 语言完全没有指定如何(或者更确切地说,它是关联的实现)从标准输入流中读取数据。C++ 唯一指定的是它这样做(默认情况下,该读取与 、 和 friends 等 C stdio 函数同步)。std::cinstd::streambufscanffread

常见的方法是让 在内部使用 C stdio 函数,并在两者之间提供最少的缓冲或没有缓冲。例如,如果你看一下 libstdc++ 实现,你可以看到它根本不使用 的 buffer 指针,只是直接返回 、 和类似的 C I/O 函数的结果。std::cinstd::streambufstd::streambuffreadgetc

更深入一步,该结构所指向的结构可以很好地缓冲它从底层操作系统 I/O 函数(即 POSIX、Windows 等)读取的数据,但该结构对标准库用户来说是不透明的。它的定义不会公开,因此除非通过 C stdio 函数,否则无法检查它。FILEFILE*std::cinstd::streambufreadReadFileExFILE

0赞 Jean-Baptiste Yunès 10/3/2023 #3

cin>>var是对原型等函数的调用。 通过引用传递。当输入被解码时,结果只是存储在 .operator>>(cin,var)istream &operator>>(istream &s,sometype & var)varvar

例如,您可以重载该运算符,以提取包含三个字段的 a,并且:Datemonthdayyear

istream &operator>> (istream &is, Date &dt) {
    is >> dt.month >> dt.day >> dt.year;
    return is;
}

标准类型没有太大区别,只是解码并存储到引用的变量中。