首页 文章

关于fstream缓冲区,flush()和sync()之间有什么区别?

提问于
浏览
13

我正在读cplusplus.com tutorial on I/O . 最后,它说fstream缓冲区与光盘上的文件同步

明确地,使用操纵器:当在流上使用某些操纵器时,会发生显式同步 . 这些操纵器是:flush和endl .

显式地,使用成员函数sync():调用流的成员函数sync(),它不带参数,导致立即同步 . 如果流没有关联的缓冲区或者出现故障,则此函数返回等于-1的int值 . 否则(如果流缓冲区已成功同步),则返回0 .

除了一些其他隐式案例(例如destroy和stream.close())

调用fstream :: flush()和fstream :: sync()有什么区别? ENDL?

在我的代码中,我总是使用flush() .

有关std :: flush()的文档:

Flush stream buffer将与流关联的缓冲区同步到其受控输出序列 . 这实际上意味着缓冲区中的所有未写入字符都会尽快写入其受控输出序列(“刷新”) .

有关std :: streambuf :: sync()的文档:

将输入缓冲区与字符源同步调用它以使流缓冲区与受控序列同步(如文件流中的文件) . 公共成员函数pubsync调用此受保护的成员函数来执行此操作 .

如果这是一个新手问题,请原谅我;我是一个菜鸟 .

4 回答

  • 5

    basic_ostream::flush 这是一个非虚函数,它将未经修改的更改写入底层缓冲区 . 如果出现错误,它会在使用的流对象中设置错误标志 . 这是因为返回值是对流本身的引用,以允许链接 .

    basic_filebuf::sync 这是一个虚函数,它将所有挂起的更改写入基础文件,并返回错误代码以指示成功或失败 .

    endl 这应用于 ostream 时,将 '\n' 写入流,然后在该流上调用 flush .

    所以,基本上: flush 是任何流的更通用的函数,而 sync 显式绑定到文件 . flush 是非虚拟的,而 sync 是虚拟的 . 这改变了在继承的情况下如何通过指针(到基类)使用它们 . 此外,他们报告错误的方式不同 .

  • 1

    syncinput 流的成员,所有未读的字符都从缓冲区中清除 . flushoutput 流的成员,缓冲输出传递给内核 .

  • 4

    C I / O涉及许多类之间的合作:流,缓冲区,语言环境和语言环境:: facet-s .

    特别是 syncflushstreamstreambuf 中存在的成员函数,因此请注意您所引用的文档,因为它们执行不同的操作 .

    在流 flush 告诉流告诉缓冲区(注意重定向)以将其内容刷新到目标 . 这样可以确保没有"pending write" .

    std::endl ,当用 << 应用于 thestream 时,不超过a

    thestream.put('\n'); thestream.flush();
    

    始终在流上, sync 告诉流告诉缓冲区刷新内容(用于输出)和读取(用于输入)尽可能多地重新填充缓冲区 .

    注意-in buffers- sync也可以由 overflow 在内部调用,以处理"buffer full"(用于输出)和"buffer empty"(用于输入)情况 .

    因此我感觉, sync 更像是一个用于缓冲通信和缓冲区实现的流的"internal"函数(它在不同的缓冲区类型中是虚拟的和覆盖的),而 flush 更像是流和客户端程序之间的接口 .

    endl ...只是一个捷径 .

  • 13

    我理解如下:

    当同步完成时, flush 将从库缓冲区中获取数据到OS 's write buffers and will eventually result in a full synchronization (the data is fully written out), but it'中,直到操作系统 .

    synch 将尽可能在给定的操作系统中尝试强制实现完全同步 - 但所涉及的操作系统可能会也可能不会促成此操作 .

    所以 flush 是:从缓冲区中获取数据并在行中写入 .
    synch 是:如果可能的话,现在强制数据被明确写出来 .

    这是我对此的理解,但是当我想到它时,我不记得我是如何达成这种理解的,所以我很想听到别人的意见 .

相关问题