如何验证c++的标准输入输出是预先存在buffer中

dachuannnnn 2013-06-23 11:57:34
最近看c++ primer,想验证一下。
不要说重定向的例子啊
...全文
323 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-06-26
  • 打赏
  • 举报
回复
运行并调试一下,这个程序吧!
int main(){
    char c='x';
    while(c!=q){
    cin>>c;
    cout<<c;
    }
    cout<<endl;
    return ;  
}
mujiok2003 2013-06-25
  • 打赏
  • 举报
回复
引用 20 楼 getmonyinfo 的回复:
[quote=引用 19 楼 mujiok2003 的回复:] [quote=引用 18 楼 getmonyinfo 的回复:] [quote=引用 17 楼 mujiok2003 的回复:] [quote=引用 16 楼 getmonyinfo 的回复:]

#include<iostream>
#include <unistd.h>

int main ()
{
	std::cout << " world";
	write (1, "hello", 5);  //write函数不带缓冲
	std::cout <<  std::endl;
}

output:
hello world


write是系统API,不属于c/c++。[/quote] 是!不过这足以验证std::cout是带缓冲的了[/quote] 只能证明你的编译器(g++)的std::cout是带缓冲的。 [/quote] 哈哈,笑死我了,g++的std::cout, 不错的玩笑啊, 什么时候iso c++的std移民到g++了,你这俩星星级别是怎么偷来的[/quote] iso c++是标准, g++是实现。 你继续笑吧。
getmonyinfo 2013-06-25
  • 打赏
  • 举报
回复
引用 19 楼 mujiok2003 的回复:
[quote=引用 18 楼 getmonyinfo 的回复:] [quote=引用 17 楼 mujiok2003 的回复:] [quote=引用 16 楼 getmonyinfo 的回复:]

#include<iostream>
#include <unistd.h>

int main ()
{
	std::cout << " world";
	write (1, "hello", 5);  //write函数不带缓冲
	std::cout <<  std::endl;
}

output:
hello world


write是系统API,不属于c/c++。[/quote] 是!不过这足以验证std::cout是带缓冲的了[/quote] 只能证明你的编译器(g++)的std::cout是带缓冲的。 [/quote] 哈哈,笑死我了,g++的std::cout, 不错的玩笑啊, 什么时候iso c++的std移民到g++了,你这俩星星级别是怎么偷来的
mujiok2003 2013-06-25
  • 打赏
  • 举报
回复
引用 18 楼 getmonyinfo 的回复:
[quote=引用 17 楼 mujiok2003 的回复:] [quote=引用 16 楼 getmonyinfo 的回复:]

#include<iostream>
#include <unistd.h>

int main ()
{
	std::cout << " world";
	write (1, "hello", 5);  //write函数不带缓冲
	std::cout <<  std::endl;
}

output:
hello world


write是系统API,不属于c/c++。[/quote] 是!不过这足以验证std::cout是带缓冲的了[/quote] 只能证明你的编译器(g++)的std::cout是带缓冲的。
getmonyinfo 2013-06-25
  • 打赏
  • 举报
回复
引用 17 楼 mujiok2003 的回复:
[quote=引用 16 楼 getmonyinfo 的回复:]

#include<iostream>
#include <unistd.h>

int main ()
{
	std::cout << " world";
	write (1, "hello", 5);  //write函数不带缓冲
	std::cout <<  std::endl;
}

output:
hello world


write是系统API,不属于c/c++。[/quote] 是!不过这足以验证std::cout是带缓冲的了
mujiok2003 2013-06-25
  • 打赏
  • 举报
回复
引用 16 楼 getmonyinfo 的回复:

#include<iostream>
#include <unistd.h>

int main ()
{
	std::cout << " world";
	write (1, "hello", 5);  //write函数不带缓冲
	std::cout <<  std::endl;
}

output:
hello world


write是系统API,不属于c/c++。
getmonyinfo 2013-06-25
  • 打赏
  • 举报
回复

#include<iostream>
#include <unistd.h>

int main ()
{
	std::cout << " world";
	write (1, "hello", 5);  //write函数不带缓冲
	std::cout <<  std::endl;
}

output:
hello world


www_adintr_com 2013-06-25
  • 打赏
  • 举报
回复
引用 13 楼 taodm 的回复:
不要试图去验证这些知识。没用处。 有用的东西还学不过来呢。
我觉得世界上所有的知识都是有用的, 没有无用的东西. 如果大家都只去研究那些热门的东西, 这个世界也太无趣了.
www_adintr_com 2013-06-25
  • 打赏
  • 举报
回复
引用 12 楼 dachuannnnn 的回复:
[quote=引用 10 楼 adlay 的回复:]

#include <Windows.h>
#include <stdio.h>

int main()
{
	printf("Start\n");
	Sleep(1000);
	printf("H");
	Sleep(1000 * 10);
	printf("\n");
}

然后用秒表掐时间, 看是输出 Start 后 1 秒出现的 H 还是 11 秒后才出现的.
这个方法 可靠吗。。[/quote] 当然, 除非你连 1 秒和 10 秒的区别都感觉不出来.
mujiok2003 2013-06-25
  • 打赏
  • 举报
回复
引用 楼主 dachuannnnn 的回复:
最近看c++ primer,想验证一下。 不要说重定向的例子啊
1. 如果标准输入、输入流不与交互式设备关联,则是完全缓冲的。 2. 如果标准输入、输入流与交互式设备关联, 是否缓冲或者如何缓冲则由具体实现决定。 看看书上是不是这么说的。
mujiok2003 2013-06-25
  • 打赏
  • 举报
回复
引用 24 楼 getmonyinfo 的回复:
[quote=引用 23 楼 mujiok2003 的回复:] [quote=引用 22 楼 getmonyinfo 的回复:] 标准是标准,编译器是编译器。c++标准只有一个,但c++编译器可以有无数个。编译器的工作是把符合标准的代码翻译成对应的汇编指令。我的g++只会翻译我的代码,不会实现iso c++标准,也不会把在标准库中的cout实现到g++编译器中
回到楼主的问题: 不过你的实例证明不了std::cout是带缓冲的,最多的也就是你的实现是带缓冲的。不是为了跟你抬杠。 另外: 编译结果是机器码,而不是汇编码。 [/quote] 好吧, 我只是就问题论问题,不知是不是我说的太冲了, 才让你有感觉要抬扛的想法。 回到问题,我要说的是我的程序是可以证明std::cout是带缓冲的。write函数在用户空间内是没有缓冲区的,所以不管给他什么内容它立马写到标准输出上。std::cout为了效率考虑,提供一个buffer,而这个buffer的行为在交互模式下需要用endl冲刷,所以我的程序输出的是hello world, 如果std::cout 没有缓冲,岂不是要输出worldhello。 另外你说的“最多的也就是你的实现是带缓冲的”,不知你要说的是什么。gcc编译器系列是对标准支持最好的, 如果g++都不能证明std::cout是带缓冲的,那么我也可以认为任何编译器都不能证明std::cout带缓冲。[/quote] 1. 讨论C++,不该用实现相关的代码来得得出结论,因为这样往往不可靠。 2. 就本问题而言,我认为是这样的: 2.1 The objectcoutcontrols output to a stream buffer associated with the object stdout, declared in <cstdio>(27.8.2). 2.2 If stdout is known to not refer to an interactive device, the stream is fully buffered. Otherwise, it is library-dependent whether the stream is line buffered or not buffered by default.
getmonyinfo 2013-06-25
  • 打赏
  • 举报
回复
引用 23 楼 mujiok2003 的回复:
[quote=引用 22 楼 getmonyinfo 的回复:] 标准是标准,编译器是编译器。c++标准只有一个,但c++编译器可以有无数个。编译器的工作是把符合标准的代码翻译成对应的汇编指令。我的g++只会翻译我的代码,不会实现iso c++标准,也不会把在标准库中的cout实现到g++编译器中
回到楼主的问题: 不过你的实例证明不了std::cout是带缓冲的,最多的也就是你的实现是带缓冲的。不是为了跟你抬杠。 另外: 编译结果是机器码,而不是汇编码。 [/quote] 好吧, 我只是就问题论问题,不知是不是我说的太冲了, 才让你有感觉要抬扛的想法。 回到问题,我要说的是我的程序是可以证明std::cout是带缓冲的。write函数在用户空间内是没有缓冲区的,所以不管给他什么内容它立马写到标准输出上。std::cout为了效率考虑,提供一个buffer,而这个buffer的行为在交互模式下需要用endl冲刷,所以我的程序输出的是hello world, 如果std::cout 没有缓冲,岂不是要输出worldhello。 另外你说的“最多的也就是你的实现是带缓冲的”,不知你要说的是什么。gcc编译器系列是对标准支持最好的, 如果g++都不能证明std::cout是带缓冲的,那么我也可以认为任何编译器都不能证明std::cout带缓冲。
mujiok2003 2013-06-25
  • 打赏
  • 举报
回复
引用 22 楼 getmonyinfo 的回复:
标准是标准,编译器是编译器。c++标准只有一个,但c++编译器可以有无数个。编译器的工作是把符合标准的代码翻译成对应的汇编指令。我的g++只会翻译我的代码,不会实现iso c++标准,也不会把在标准库中的cout实现到g++编译器中
回到楼主的问题: 不过你的实例证明不了std::cout是带缓冲的,最多的也就是你的实现是带缓冲的。不是为了跟你抬杠。 另外: 编译结果是机器码,而不是汇编码。
getmonyinfo 2013-06-25
  • 打赏
  • 举报
回复
引用 21 楼 mujiok2003 的回复:
[quote=引用 20 楼 getmonyinfo 的回复:] [quote=引用 19 楼 mujiok2003 的回复:] [quote=引用 18 楼 getmonyinfo 的回复:] [quote=引用 17 楼 mujiok2003 的回复:] [quote=引用 16 楼 getmonyinfo 的回复:]

#include<iostream>
#include <unistd.h>

int main ()
{
	std::cout << " world";
	write (1, "hello", 5);  //write函数不带缓冲
	std::cout <<  std::endl;
}

output:
hello world


write是系统API,不属于c/c++。[/quote] 是!不过这足以验证std::cout是带缓冲的了[/quote] 只能证明你的编译器(g++)的std::cout是带缓冲的。 [/quote] 哈哈,笑死我了,g++的std::cout, 不错的玩笑啊, 什么时候iso c++的std移民到g++了,你这俩星星级别是怎么偷来的[/quote] iso c++是标准, g++是实现。 你继续笑吧。 [/quote] 标准是标准,编译器是编译器。c++标准只有一个,但c++编译器可以有无数个。编译器的工作是把符合标准的代码翻译成对应的汇编指令。我的g++只会翻译我的代码,不会实现iso c++标准,也不会把在标准库中的cout实现到g++编译器中
www_adintr_com 2013-06-24
  • 打赏
  • 举报
回复

#include <Windows.h>
#include <stdio.h>

int main()
{
	printf("Start\n");
	Sleep(1000);
	printf("H");
	Sleep(1000 * 10);
	printf("\n");
}

然后用秒表掐时间, 看是输出 Start 后 1 秒出现的 H 还是 11 秒后才出现的.
mujiok2003 2013-06-24
  • 打赏
  • 举报
回复
调试一下,以vc++ 2012为例.

std::streambuf* pcinbuf = std::cin.rdbuf();
double v;
std::cin >> v; //enter: 7.8 and more
std::streambuf* pcoutbuf = std::cout.rdbuf();
std::cout << "hello";
return 0;


执行到return 0;察看pcinbuf和pcoutbuf




这里只说明VC2012的实现而已,其它编译未必如此.不过要求证其它编译器是如何实现的,方法类似.
  • 打赏
  • 举报
回复
先cout输出 再调用
VOID WINAPI ExitProcess(
  __in  UINT uExitCode
);
lm_whales 2013-06-24
  • 打赏
  • 举报
回复
写个程序,调试之看汇编源码或者二进制代码。
dachuannnnn 2013-06-24
  • 打赏
  • 举报
回复
引用 4 楼 It_way 的回复:
ISO 标准的 C/C++ 是带缓冲的,所有对上层IO的读写对象 都是 缓冲区 当遇到以下几种情况 会 将 缓冲区 的 内容 真正的写入 1、遇到换行 2、缓冲区满了 3、手动调用 fflush ...
对,我知道这些,我是想如何来验证一下?
dachuannnnn 2013-06-24
  • 打赏
  • 举报
回复
引用 3 楼 bluewanderer 的回复:
system需要使用输出流的。另外我发现VC++貌似是根本不缓冲的,GCC是不换行就不显示。
你的意思是 linux下的时候 没有endl就不会显示?
加载更多回复(7)

64,656

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧