代码之家  ›  专栏  ›  技术社区  ›  Brian T Hannan

什么时候使用C++ iFixes优于读文件、写文件、FPrTNTF等等?

  •  8
  • Brian T Hannan  · 技术社区  · 15 年前

    我发现使用C++中的流来代替Windows函数(如Read Frand、WrreFiell等)甚至FPRINTF是非常容易的。什么时候用小溪不好?什么时候用小溪比较好?使用溪流安全吗?为什么很多程序员不使用流?

    这正是我一直想知道的,也许你可以释放一些智慧。

    7 回复  |  直到 8 年前
        1
  •  10
  •   luke    15 年前

    什么时候用小溪不好?

    • 流不能保证是线程安全的。在没有同步的情况下,很容易想到无法使用流。
    • 流对象通常相当“重”。他们 可以 对于内存不足或嵌入式环境来说太重。

    什么时候用小溪比较好?

    一般来说。

    使用溪流安全吗?

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

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

    偏好、风格,或者他们首先学习了不同的方法(或者不同的语言)。我发现很多旧的“C++”例子都是用C语言写成的,喜欢打印出来。

        2
  •  11
  •   Jerry Coffin    15 年前

    小溪一般都很安全。在某些情况下,它们可能是缓慢和/或笨拙的。缓慢,主要是因为它们在代码和操作系统之间强加了一些额外的层,在错误的情况下,这些层会增加开销。笨拙主要是与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通常不会有竞争力。

        3
  •  4
  •   Goz    15 年前

    不能对流进行异步文件I/O…

        4
  •  3
  •   Hassan Syed    15 年前
    1. 当你希望你的应用可以移植到不同的平台上。

    2. 当您想要更简洁的代码时:win32函数有更复杂的语义,通常需要一组函数来做一些事情,并且肯定有更多的参数。

        5
  •  1
  •   dicroce    15 年前

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

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

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

        6
  •  1
  •   Anurag    15 年前

    原因之一是 i18n

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

    VS

    string format = "the current time is %s";
    string format = "वर्तमान समय %s है।";
    string format = "%s في الوقت الحالي هو";
    printf(format, time);
    
        7
  •  1
  •   Community chadoh    7 年前

    您在这里提到了三个备选方案:

    1. C++流(oFrase,istrAM,fStand)
    2. C stdio(打印,sprintf fprintf)
    3. Windows文件(读文件、写文件)

    选项1和2是平台独立的。这意味着您可以为Mac、Linux或许多其他操作系统编译代码。选项3仅限Windows。这意味着除了Windows,您不能编译它。

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

    C++的IoSt流与C的STDIO是一个激烈的争论,在本论坛的许多其他地方讨论过,例如 C++ Streams vs. C-style IO? 以及其他在线的地方。