C格式的I/O函数(printf、sprintf等)比IOStream更受欢迎吗?如果是,为什么? 我最近一直在浏览别人编写的很多代码,并且注意到每个人都使用了“Primtf”风格的C函数,但是在学校里(Cout,具体地)所学的C++函数似乎并不那么受欢迎。

C格式的I/O函数(printf、sprintf等)比IOStream更受欢迎吗?如果是,为什么? 我最近一直在浏览别人编写的很多代码,并且注意到每个人都使用了“Primtf”风格的C函数,但是在学校里(Cout,具体地)所学的C++函数似乎并不那么受欢迎。,c++,io,outputstream,C++,Io,Outputstream,这是一个有效的观察结果吗?这有什么原因吗? 惯例 谢谢 R对标准流系统有一些批评——最明显的是,它的性能通常不如C的系统,而且它们不允许对要格式化的项进行重新排序,这会使本地化更加困难 就我个人而言,我几乎所有的事情都使用流,因为它们允许我将函数写入控制台、文件或字符串,而无需修改函数。就我个人而言,我在iostream上使用printf,因为我认为它更清晰 当您使用iostream进行格式化时,您必须我认为味道是一个可能的原因。我个人认为: printf("%8d: %s\n", custom

这是一个有效的观察结果吗?这有什么原因吗? 惯例

谢谢


R

对标准流系统有一些批评——最明显的是,它的性能通常不如C的系统,而且它们不允许对要格式化的项进行重新排序,这会使本地化更加困难


就我个人而言,我几乎所有的事情都使用流,因为它们允许我将函数写入控制台、文件或字符串,而无需修改函数。

就我个人而言,我在
iostream
上使用
printf
,因为我认为它更清晰


当您使用
iostream
进行格式化时,您必须
我认为味道是一个可能的原因。我个人认为:

printf("%8d: %s\n", customer->id, customer->name);
更具可读性:

std::cout << customer->id << ": " << customer->name << std::endl;

std::cout id在我工作的地方,我们使用
printf
样式的格式。这是因为我们曾经大量使用MFC
CString
类及其
printf
-style
Format
方法。我们一直在逐步淘汰MFC,但并没有改变我们的字符串格式化方法


至于哪一个设计得更好,请参见printf和scanf系列函数有两个主要问题:类型安全和内存安全。很容易在规范字符串和后面的可变长度参数列表之间产生不匹配。此外,通过scanf的缓冲区溢出是一个典型的安全漏洞。简而言之,不要使用它们

< C++流提供了类型和内存安全性,也格式化了可扩展性。它们比printf和scanf强大得多,而且通常更易于使用


此外,正如ShaderOp所建议的,Boost的格式库提供了同样的安全性,但让老C程序员感觉更舒适。

我猜printf的使用更广泛,因为

    在C++编译器和流出现之前,它已经使用了好几年。
  • C比C更常用++
  • 很多I/O都是为Windows API这样的东西做的,对于它,printf自然适合于打开/读取/写入/关闭等


每个人
似乎都有点极端。还要看看:谁是每个人,你不应该做出如此宽泛的假设。他完全正确。这是因为iOxFixs太难了,甚至让C++程序员哭了,而且他们习惯于废话:我只使用<代码> IoSturis,用于输入、输出或格式化。它们有自己的怪癖,但至少是类型安全的。+1指出了状态与无状态的区别。当您不必担心输出数据的尝试是否会同时发生时,这确实是一件好事。有一点值得指出的是,您可以使用C++代码串使用Prtff样式标志,使用<代码> Boo::格式< /C> >,可以使用带有TrpF格式样式说明符的流,使用代码>升压::格式< /代码>,您知道:)作为参数传递
文件*
与传递
ostream
参数一样简单。允许
fprintf
写入控制台或文件。@格威尔:上次我检查时,我无法使文件*写入内存缓冲区。@Billy ONeal,再看看,这些东西是存在的!GNU库支持
fmemopen()
。它不是一个标准,但它可以存在。请参阅C++ 1,以获得良好的交叉引用。C++是足够低的级别,您可以在脚中总是自己射击,即使有流和“类型安全”,例如, CUT,编译器也只能在知道格式字符串的情况下验证格式字符串。但与iostreams相比,
printf
的一个优点是可以在运行时设置格式字符串。因此,类型安全性对我来说似乎是一个有效的论点。@任何一个象形的C++编译器都会捕获C样式的CAST并发出警告。well@Dennis:任何在运行时构造格式化字符串的人(加载国际化版本除外)都需要被枪杀(如果没有其他安全缺陷的话)@Billy:加载国际化版本正是我所说的。编译器帮不了你。奇怪的答案。对区域设置的支持实际上是iostream明显优于printf的一个方面,并且不太难使用。