gpt4 book ai didi

c++ - 缓冲和非缓冲流

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

在缓冲流的情况下,它在书中说它等到缓冲区已满才写回监视器。例如:

cout << "hi"; 
  • “缓冲区已满”是什么意思。
    cerr << "hi";
  • 我的书上说所有东西都发到cerr立即写入标准错误设备,这是什么意思?
    char *ch;
    cin>> ch; // I typed "hello world";
  • 在这个例子中 ch将被分配给“hello”和“world”将被忽略是否意味着它仍在缓冲区中并且会影响 future 语句的结果?
  • 最佳答案

    你的书似乎不是很有帮助。

    1) 输出流将它们的字节发送到 std::streambuf , 这可能
    包含一个缓冲区; std::filebuf (源自 streambuf )被使用
    std::ofstream一般会被缓冲。这意味着当
    你输出一个字符,不一定立即输出;它会
    写入缓冲区,仅当缓冲区被写入时才输出到操作系统
    full,或者您以某种方式明确请求它,通常是通过调用flush()在流上(直接或间接使用 std::endl )。
    然而,这可能会有所不同;输出到 std::coutstdout ,并且大多数实现或多或少会遵循以下规则stdoutstd::cout , 改变缓冲策略,如果输出
    要去一个交互式设备。

    无论如何,如果您不确定,并且您想确保输出
    真的离开你的程序,只需添加一个调用flush。

    2)你的书在这里是错误的。

    缓冲策略之一是 unitbuf ;这是一个标志std::ostream您可以设置或重置( std::ios_base::set()std::ios_base::unset()std::ios_base是一个基类std::ostream ,因此您可以在 std::ostream 上调用这些函数
    目的)。当unitbuf已设置,std::ostream添加到 flush() 的电话
    到每个输出函数的末尾,所以当你写:

    std::cerr << "hello, world";

    流将在字符串中的所有字符后刷新
    是输出,提供 unitbuf设置。开机时, unitbuf已设置
    std::cerr ;默认情况下,它不会在任何其他文件上设置。但是你
    可以随意设置或取消设置。我会建议反对
    取消设置 std::cerr ,但如果 std::cout正在输出到
    交互式设备,将其设置在那里很有意义。

    请注意,这里的所有问题都是 streambuf 中的缓冲区。 .
    通常,操作系统也会缓冲。所有刷新缓冲区所做的是
    将字符传输到操作系统;这个事实意味着你不能使用 ofstream当需要事务完整性时直接使用。

    3) 当您使用 >> 输入字符串或字符缓冲区时, 这 std::istream首先跳过前导空格,然后输入最多
    但不包括下一个空格。在正式条款中
    标准,它从流中“提取”字符,以便它们
    不会再被看到(除非你寻找,如果流支持它)。
    下一个输入将从前一个停止的地方拾取。无论
    以下字符在缓冲区中,或仍在磁盘上,确实是
    无关。

    请注意,输入的缓冲有些复杂,因为它发生
    在几个不同的级别,在操作系统级别,它需要不同的
    形式取决于设备。通常,操作系统将通过以下方式缓冲文件
    部门,通常提前读取几个部门。操作系统将始终
    返回所需数量的字符,除非遇到结尾
    文件。大多数操作系统将逐行缓冲键盘:不从
    读取请求直到输入完整行,并且永不返回
    读取请求中超出当前行末尾的字符。

    以与 std::ostream 相同的方式使用 streambuf对于输出, std::istream使用一个来获取每个单独的字符。在这种情况下
    std::cin ,通常是 filebuf ;当 istream请求一个字符, filebuf将从其缓冲区返回一个,如果
    它有一个;如果没有,它将尝试重新填充缓冲区,
    请求例如512 个(或任何它的缓冲区大小)字符
    操作系统。哪个将根据其缓冲策略响应
    设备,如上所述。

    无论如何,如果 std::cin已连接到键盘,并且您已经
    输入 "hello world" ,您输入的所有字符都将被读取
    最终由溪流。 (但如果你使用 >> ,会有很多
    你不会看到的空白。)

    关于c++ - 缓冲和非缓冲流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10518608/

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