- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我刚刚了解到ios_base::sync_with_stdio
函数的存在,它基本上可以让你关闭(或者如果你已经关闭它就打开)iostream
之间的同步在 C++ 中使用的 code> 流和作为标准 C 一部分的 cstdio
流。
现在,我一直认为 C 中的 stdout
、stderr
和 stdin
本质上是封装在 iostreams 中的 C++ 中的一组对象中类。但如果它们必须相互同步,这将表明 C++ 的 iostream
类不是 C 的 stdin< 的包装器
等
我对此感到很困惑?有人可以澄清 C++ 的 iostream 和 C 的 stdio 是如何不同 做同样事情的事情,只是在不同的抽象级别?我以为他们是同一件事!?
它们是如何同步的?我一直认为它们是同一个东西,本质上是一个包裹另一个。
最佳答案
C 和 C++ 标准对事物的实现方式没有任何要求,只是对某些操作的效果做出了要求。对于<stdio>
与 <iostream>
功能这意味着一个可以包装另一个,两者可以本质上相同,或者它们完全独立。从技术上讲,出于多种原因,使用通用实现将是理想的(例如,不需要显式同步,并且会有一个定义的机制来扩展 FILE*
用于用户定义的系统)但我不知道任何系统实际上做这个。让一个实现成为另一个实现的包装是可能的并实现 <iostream>
s 表示为 <stdio>
是一个典型的实现选择,尽管它的缺点是它为某些操作引入了额外的成本,并且大多数 C++ 标准库已经开始使用完全独立的实现。
不幸的是,封装实现和独立实现都有一个共同的问题:I/O 在完成一个字符级别时效率非常低。因此,缓冲字符并从缓冲区读取或写入缓冲区基本上是强制性的。这对于彼此独立的流非常有效。问题是标准 C 流 stdin
, stdout
, stderr
及其对应的 C++ 窄字符 std::cin
, std::cout
, std::cerr
/std::clog
和 C++ 宽字符对应 std::wcin
, std::wcout
, std::wcerr
/std::wclog
,分别是:当用户从 stdin
中读取两者时会发生什么?和 std::cin
?如果这些流中的任何一个从底层 OS 流中读取字符缓冲区,则读取将出现乱序。同样,如果两个 stdout
和 std::cout
当用户同时写入两个流时,使用的独立缓冲区字符将以意外的顺序出现。因此,标准 C++ 流对象(即 std::cin
、std::cout
、std::cerr
和 std::clog
及其对应的宽字符)有一些特殊规则,要求它们与各自的 <stdio>
同步。对方。实际上,这意味着这些 C++ 对象要么直接使用通用实现,要么根据 <stdio>
实现。 和不缓冲任何字符。
我们意识到,如果实现不共享一个共同的基础,这种同步的成本是相当可观的,并且对于某些用户来说可能是不必要的:如果用户只使用 <iostream>
他不想支付额外的间接费用,更重要的是,他不想支付不使用缓冲区所带来的额外成本。对于谨慎的实现,不使用缓冲区的成本可能相当高,因为这意味着某些操作最终不得不在每次迭代中进行检查,并且可能需要进行虚函数调用,而不是偶尔进行一次。因此,std::sync_with_stdio()
可用于关闭此同步,这可能意味着标准流对象或多或少完全改变了它们的内部实现。由于标准流对象的流缓冲区可以被用户替换,不幸的是,流缓冲区不能被替换,但流缓冲区的内部实现是可以改变的。
在 <iostream>
的良好实现中库所有这些只影响标准流对象。也就是说,文件流应该完全不受此影响。但是,如果您想使用标准流对象并希望获得良好的性能,您显然不想混合 <stdio>
和 <iostream>
并且您想关闭同步。特别是在比较 <stdio>
之间的 I/O 性能时和 <iostream>
你应该意识到这一点。
关于c++ - cstdio 流与 iostream 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9653751/
我正在尝试创建一个迭代器来遍历我的文件。我的文件是二进制的,里面有 int 值,所以在我看来,它应该像那样工作。但是我收到错误提示“无效使用数据成员‘IntFile::file’”所以我在代码中标记了
我有一个要写入数据的文件,使用 cstdio 中的函数。我想确保文件已成功写入文件而没有任何中断,因此我知道稍后读取文件时会从文件中得到什么。我打算这样做的方法是,首先将 8 个字节的清零数据写入文件
下面的 C 代码有什么问题? (更新) int nfds = 0; char c[2] = " "; char ans[2] = " "; printf("Test p or s [p,s]: p?
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
当我添加 #include 时,我在 cstdio 中遇到了很多错误到 C 程序。 c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\in
我有一些数据使用 cin/in 太慢了。每行三个整数: 1 2 2 3 4 1 5 6 122 6 4 7 如何读入循环中的每一行,以获得结果(对于第一次迭代): x==1; y==2; z==2;
我正在上我的第一门 c++ 课(我在第 6 周。) 我使用了 getchar(),根据我能找到的所有引用资料,它位于 cstdio(或 stdio 或 stdio.h)中。只是为了看看会发生什么,我注
我正在寻找一个类似于 iostreams 的库,因为它执行转换,并允许写入内存缓冲区、文件和控制台。但是,我想要一些类型安全的东西,就像 iostream 一样。有没有真正的图书馆可以做到这一点? 能
我刚刚了解到ios_base::sync_with_stdio函数的存在,它基本上可以让你关闭(或者如果你已经关闭它就打开)iostream之间的同步在 C++ 中使用的 code> 流和作为标准 C
我从 cstdio 的 c++ 引用中看到这一行: 库的每个元素都在 std 命名空间中定义。但我尝试了代码: std::printf("hello world"); printf("hello wo
这个问题已经有答案了: Correct format specifier for double in printf (5 个回答) 已关闭 6 年前。 使用 cstdio header 的 doubl
下面的 c++ 程序无法读取文件。我知道使用 cstdio 不是很好的做法,但我已经习惯了,它应该可以正常工作。 $ ls -l l.uyvy -rw-r--r-- 1 atilla atilla 6
我正在尝试使用 C++ 习惯用法将字符写入 cout,但我在任何 C++ 标准库中都找不到字符格式化程序。 最佳答案 字符自动格式化为 %c。要将整数打印为 char(如果你真的想要),你可以转换它:
_gnu_cxx::snprintf has not been declared 当我在我的 cpp 中包含字符串时。此错误位于此行: using ::__gnu_cxx::snprintf; cst
是吗C++ 中的 header 包含与 相同的功能但输入 std命名空间? 我在使用 mingw-w64 编译的程序中遇到了奇怪的效率问题,它比在 linux 上慢十倍以上。经过一些测试,我发现问题
假设我有这样的代码片段: #include using namespace std; int main(int argc, char *argv[]) { printf("%d",5); } 它在我
我正在尝试编写一个简单的程序,以 1024 字节为单位从文件(输入)读取数据,然后将数据写入另一个文件(输出)。该程序到目前为止工作,但我遇到的问题是,如果它到达文件末尾并且最后一次读取不是 1024
以下代码会引发许多错误: namespace ns1 { #include ... } /usr/include/c++/4.9/cstdlib:118: error: '::d
所以这个问题只是出于好奇。我有一些小程序: #include void print(){ printf("abc"); } // don't care about main, I'm not gon
我正在编写使用 C++ 库中定义的一些类的 Cocoa 代码。我给文件名加上扩展名 .mm,通常一切正常。 但并非总是如此。有时 Xcode 4 让我失望:“词法或预处理器问题:‘cstdio’未找到
我是一名优秀的程序员,十分优秀!