`
isiqi
  • 浏览: 16555111 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

关于 C/C++ 的输入输出缓冲

阅读更多


printf 无缓冲,cout 有缓冲;
缓冲刷新的时刻有:
1. 缓冲区满;
2. 输出 endl;
3. 显式调用 flush 函数;
4. 程序结束时。



C 中缓冲设置相关的函数:setbuf()



cout.setf(ios::stdio);
上述语句让 iostream 和 stdio 共用一个缓冲。



程序1:
////////////////////////////////////
#include "iostream.h"
#include "stdio.h"

int main()
{
cout << "ok1";
printf("%s", "ok");
cout << "ok2";

return 0;
}
////////////////////////////////////

程序1在 vc 6.0 里的输出结果为:
okok1ok2
其原因是:cout << "ok1"; 的时候没有刷新缓冲区,而 printf 输出后就刷新了。当 cout << "ok2"; 的时候,缓冲仍然没有被刷新。直到退出程序的时候,iostream 才刷新它的缓冲。所以 cout 的输出在 printf 后面。如果要顺序输出的话,在 cout 语句最后加上 << endl (cout << "ok1" << endl;),endl 会刷新缓冲的。

在 gcc 和 vs.net 中的输出正常,如下:
ok1okok2

程序2:
////////////////////////////////////
#include "iostream.h"
#include "stdio.h"

int main()
{
cout << "ok1";
printf("%s", "ok");
cout << "ok2";
for (int i = 1; i = 1; )
{
;
}

return 0;
}
////////////////////////////////////

程序2在 vc 6.0 里的输出结果为:
ok
其原因是:程序最后有个无限循环,所以cout没有机会被刷新(一般程序退出的时候 cout 会被刷新缓冲)。

在 gcc 和 vs.net 中的输出正常,如下:
ok1okok2



在多线程中用 printf 的话,其中的内容往往能在一个时间片内输出;而如果用 cout 的话,就不能够保证是否能在一个时间片内输出,即使加了 flush 或 endl 也一样。


参考:
1. http://topic.csdn.net/t/20020707/12/855968.html
2. http://bbs.sjtu.edu.cn/bbsanc,path,%2Fgroups%2FGROUP_1%2FACMICPC%2Ftemporary%2FD4D425840%2FM.1054035254.A.html
3. http://community.csdn.net/Expert/TopicView3.asp?id=5030264
分享到:
评论

相关推荐

    c/c++中文帮助文档(API)

    例如,`iostream`库提供了流式输入输出,`std::cin`用于从标准输入读取,`std::cout`用于标准输出;`vector`和`list`是两种常用的容器,它们存储和操作动态大小的元素集合;`algorithm`库包含了各种算法,如排序、...

    c/c++算法实现多路pcm混音源码

    本主题聚焦于"C/C++算法实现多路PCM混音源码",这是一个关于音频混合的技术,涉及到数字信号处理(DSP)的基础知识,C/C++编程语言的应用,以及特定的PCM音频格式的理解。 PCM(Pulse Code Modulation,脉冲编码...

    c/c++语句大全;c/c++函数大全

    - **说明**: 用于清除文件流的错误状态标志,便于重新进行输入输出操作。 ##### 18. `clock()` - **定义**: `#include &lt;time.h&gt;` - **功能**: 获取程序运行时间。 - **说明**: `clock()` 返回自程序启动以来经过的 ...

    NI采集卡 linux下C/C++语言demo

    标题 "NI采集卡 Linux下C/C++语言demo" 涉及到的是使用National Instruments(NI)的DAQmx(数据采集和测量系统)驱动在Linux操作系统中进行数据采集的编程实践。NI采集卡是一种用于实验测量和控制的硬件设备,能够...

    my c/c++ code

    对于ACM竞赛来说,熟悉标准输入输出(scanf/printf)、快速读写技巧(如cin/cout的缓冲区管理)以及时间复杂度分析都是必不可少的。 总之,这个压缩包可能包含了作者在学习C++或参加ACM比赛过程中编写的代码,通过...

    Windows Via C/C++,Fifth Edition .pdf

    第五章“作业”介绍了如何通过作业对象来限制一组进程的资源使用,包括CPU时间、内存和输入/输出操作。这在服务器和高性能计算环境中尤其有用,可以确保关键任务进程不会被非关键任务消耗过多资源。 ### 线程基础 ...

    C/C++的全缓冲、行缓冲和无缓冲

    在C/C++编程中,理解缓冲的概念对于优化程序性能至关重要。缓冲主要分为全缓冲(Full Buffering)、行缓冲(Line Buffering)和无缓冲(No Buffering)三种类型。 1. **全缓冲**: 全缓冲模式下,数据会被存储在一...

    C/C++头文件一览

    - **用途**:提供了基于字符串缓冲区的输入输出功能。 - **示例**: ```c++ #include #include int main() { char buffer[100]; sprintf(buffer, "Result: %d", 42); printf("%s\n", buffer); return 0; ...

    C/C++关于文件的操作

    - **打开文件**:在C++中,`fstream`库提供了`ifstream`(输入流)、`ofstream`(输出流)和`fstream`(双向流)类来处理文件。使用`open()`函数可以打开文件,如`ifstream file("filename.txt"); file.open();`。 ...

    C/C++编写的base64编解码源码

    在C或C++中实现Base64编解码可以帮助开发者处理这些场景。本节将深入探讨Base64的概念、工作原理以及如何用C/C++进行实现。 1. **Base64概念** Base64是一种将任意二进制数据转换为可打印ASCII字符的编码方法。它...

    c/c++ 字符集转换

    `iconv()`接受输入缓冲区、输入缓冲区长度、输出缓冲区、输出缓冲区长度等参数,并返回转换后的新长度。如果转换成功,`iconv()`会更新输入和输出缓冲区的指针。例如: ```c++ char* inbuf = ...; // 输入GBK编码的...

    linux C/C++超有用4

    5. **标准库和POSIX接口**:C和C++标准库提供了大量的通用函数,如内存管理、输入/输出操作等。POSIX(Portable Operating System Interface)接口为Linux提供了与操作系统交互的一致性接口,如进程控制、线程管理、...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

    gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户...

    linux C/C++超有用2

    Linux支持标准C++库(如libstdc++),并可以通过`&lt;iostream&gt;`、`&lt;fstream&gt;`等头文件实现输入/输出流,`&lt;vector&gt;`、`&lt;map&gt;`等容器用于数据结构,以及`&lt;thread&gt;`和`&lt;mutex&gt;`用于多线程编程。同时,C++的模板机制允许...

    C/C++库函数中文说明

    例如,`iostream`库提供了`cin`和`cout`用于输入输出操作,`string`类用于方便地处理字符串,`vector`和`array`等容器类则用于存储和操作动态数据集合。此外,C++标准库还包含了大量的算法,如`sort`、`find`、`...

    emacs config for C/C++

    例如,M-x compile可以调用系统编译器,并在Emacs的缓冲区中显示编译输出,方便查看错误。gdb集成则允许在Emacs内直接调试程序,使用gud-gdb或ede/gdb等模式,可以设置断点、单步执行、查看变量值等。 为了提高代码...

    C/C++全部函数查询

    C语言的标准库(stdio.h, string.h, math.h等)包含了各种基础操作,如输入输出、字符串处理、数学运算等。例如,`printf`函数用于格式化输出,`scanf`用于从标准输入读取数据;`strcpy`和`strcat`处理字符串复制和...

    c/c++面试、笔试大全,打包下载(18m)

    7. **文件操作**:读写文件、流缓冲、格式化输入输出等是C/C++中常见的I/O操作,面试中可能会设计到文件的打开、关闭、读写模式等。 8. **编译与链接**:了解编译器的工作原理、预处理、编译、汇编、链接过程,以及...

Global site tag (gtag.js) - Google Analytics