gpt4 book ai didi

c++ - 我创建的 c++ istream 对象和 cin 之间的区别在哪里,它在库中的何处可见

转载 作者:太空狗 更新时间:2023-10-29 21:15:27 25 4
gpt4 key购买 nike

cin 是一个 istream 对象。

它是在 iostream 中创建的:

      /**
* @name Standard Stream Objects
*
* The &lt;iostream&gt; header declares the eight <em>standard stream
* objects</em>. For other declarations, see
* http://gcc.gnu.org/onlinedocs/libstdc++/manual/io.html
* and the @link iosfwd I/O forward declarations @endlink
*
* They are required by default to cooperate with the global C
* library's @c FILE streams, and to be available during program
* startup and termination. For more information, see the section of the
* manual linked to above.
*/
//@{
extern istream cin; /// Linked to standard input
extern ostream cout; /// Linked to standard output
extern ostream cerr; /// Linked to standard error (unbuffered)
extern ostream clog; /// Linked to standard error (buffered)

#ifdef _GLIBCXX_USE_WCHAR_T
extern wistream wcin; /// Linked to standard input
extern wostream wcout; /// Linked to standard output
extern wostream wcerr; /// Linked to standard error (unbuffered)
extern wostream wclog; /// Linked to standard error (buffered)
#endif
//@}

我试图创建另一个 istream 并像 cin 一样使用它 - 它没有工作。

#include<iostream>

int main()
{
std::istream dada;
int foo;

dada>>foo;
std::cout<<foo;

return 0;
}

因为它不会编译。我只是查看库文件以了解 cin 是如何链接到我的 shell 而另一个 istream 对象不是。有人可以解释吗?我对 cin 链接到 STDIN 缓冲区的文件感兴趣。

非常感谢。

最佳答案

std::istream 只是一个外观:它提供有用的函数和运算符,允许您提取数字、任意数量的字符和其他东西,而无需摆弄底层流,这实际上只是一个字符序列。

实际工作是由 streambuf 对象完成的。 Streams 存储指向它的指针,并在需要时从中请求字符。因此,当您从流中读取数字时,流会向缓冲区询问字符,直到找到非数字字符,然后将数字字符转换为数字。

现在回答你的问题。标准确实要求 std::cinstd::istream 类型,但它没有说明它的缓冲区是什么类型(除了它派生自 std::streambuf).标准也不提供这样的缓冲区供用户使用,因此可以将其视为编译器魔法

实现此类缓冲区的唯一标准方法是创建您自己的缓冲区类,派生自 streambuf,它将与 STDIN(或 cin,但它会很奇怪)交互,并将指针传递给它到 istream 构造函数。

或者,您可以使用 std::cin 自己的缓冲区:

std::istream my_cin(std::cin.rdbuf());
int x;
my_cin >> x;

关于c++ - 我创建的 c++ istream 对象和 cin 之间的区别在哪里,它在库中的何处可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779558/

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