9

我发现在 c++ 中使用流比使用 ReadFile、WriteFile 等甚至 fprintf 等 Windows 函数要容易得多。什么时候不适合使用流?什么时候最好使用流?使用流安全吗?为什么很多程序员不使用流?

这只是我一直想知道的事情,也许您可​​以从中汲取一些智慧。

4

7 回答 7

11

流通常是相当安全的。在某些情况下,它们可能很慢和/或笨拙。慢,主要是因为它们在您的代码和操作系统之间强加了一些额外的层,并且在错误的情况下,这些层会增加开销。笨拙主要是与 C 的 printf 相比,而不是直接使用 WriteFile 之类的东西(它根本不直接支持格式化)。但是,例如,请考虑:

printf("%2.2x", ch);` 

std::cout << std::hex << std::setw(2) << std::setprecision(2) << std::setfill('0') << ch; 
std::cout << setfill(' ');

然后考虑一个事实,如果您关心 i18n,printf它使用的是一个易于从外部源读取的字符串,其中 C++ 流将所有格式嵌入到代码结构中,因此几乎任何格式更改都需要重写代码,重新编译和重新链接。

CreateFile, ReadFile等,还允许 iostreams 根本不支持的许多事情,例如内存映射文件和重叠读写。如果情况允许您充分利用这些,iostreams 通常不会有竞争力。

于 2010-01-21T18:09:13.720 回答
10

什么时候不适合使用流?

  • 不保证流是线程安全的。很容易想象一个没有同步就不能使用流的情况。
  • 流对象通常非常“重”。对于低内存或嵌入式环境,它们可能太重了。

什么时候最好使用流?

一般来说。

使用流安全吗?

是的,但是在异步共享流时必须小心。

为什么很多程序员不使用流?

偏好、风格或他们首先学习了不同的方法(或不同的语言)。我发现网上很多旧的“c++”示例都是用 C 风格编写的,更喜欢 printf 而不是 cout。

于 2010-01-21T18:09:25.673 回答
4

您不能对流进行异步文件 i/o ...

于 2010-01-21T18:13:57.863 回答
3
  1. 当您希望您的应用程序可移植到不同的平台时。

  2. 当你想要更简洁的代码时:win32函数有更精细的语义,往往需要一个函数的集合来做某事,而且肯定有更多的参数。

于 2010-01-21T17:59:18.247 回答
1

我喜欢 printf() 的原因之一是格式字符串本身可以是资源,因此可以在不强制重新编译的情况下对程序输出进行更多的外部控制。

我喜欢 cout() 的原因之一是它的原始速度。

根据我的经验,这往往是一个相当宗教的问题。

于 2010-01-21T18:09:48.457 回答
1

一个原因是i18n

string time = "4:32";
cout << "the current time is " << time;
cout << "वर्तमान समय " << time << " है।"
cout << time << "في الوقت الحالي هو";

对比

string format = "the current time is %s";
string format = "वर्तमान समय %s है।";
string format = "%s في الوقت الحالي هو";
printf(format, time);
于 2010-01-21T18:13:59.633 回答
1

您在这里提到了三种选择:

  1. C++ 流(ostream、istream、fstream)
  2. C 标准输入输出 (printf, sprintf fprintf)
  3. Windows 文件(ReadFile、WriteFile)

选项 1 和 2 与平台无关。这意味着您可以为 mac、linux 或许多其他操作系统编译代码。选项 3 仅适用于 Windows。这意味着您不能为 Windows 以外的任何东西编译它。

在选项 1 和 2 之间做出决定时,取决于您要如何使用它。C 库在语言方面更易于使用。尝试用流中的替代语言替换文本是一场噩梦,但是使流线程安全、将更复杂的类转换为可打印格式以及扩展流功能要容易得多。

C++ 的 iostream 与 C 的 stdio 是一个非常激烈的争论,在本论坛的许多其他地方都进行了讨论,例如 C++ Streams 与 C 风格的 IO?和其他地方在线。

于 2016-11-04T10:44:29.533 回答