注册 登录
编程论坛 C++教室

输入输出流的一个简单问题,请各位帮个忙,谢谢了

lovecsky 发布于 2007-05-04 00:16, 581 次点击
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void main(void)
{
char ch;
cout<<"按下一个字符:";

ch=getche(); //为什么此种输入方式先于cout执行,非缓冲的
//ch=cin.get(); //而此种缓冲输入的方式结果如愿
//ch=getchar(); //这种方式也有问题,知道正确的方式,但想知道这样为什么有问题,和ch=cin.get()相比

cout<<endl<<"你输入的字符是:"<<ch<<endl;
}


希望的输出结果:
/*
按下一个字符:m

你输入的字符是:m
*/
4 回复
#2
yuyunliuhen2007-05-04 00:47
以下是引用lovecsky在2007-5-4 0:16:23的发言:
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void main(void)
{
char ch;
cout<<"按下一个字符:"<<flush; //可以达到你预期的效果了吧,

ch=getche(); //为什么此种输入方式先于cout执行,非缓冲的
//ch=cin.get(); //而此种缓冲输入的方式结果如愿
//ch=getchar(); //这种方式也有问题,知道正确的方式,但想知道这样为什么有问题,和ch=cin.get()相比

cout<<endl<<"你输入的字符是:"<<ch<<endl;
}


希望的输出结果:
/*
按下一个字符:m

你输入的字符是:m
*/

可标准输出流 (cout) 能用于应用程序或 - 动态链接库 (DLL) 来显示信息。同时, 使用应用程序和 DLL 中 cout 时特别注意需要确保文本显示被同步。
cout 流开发与 Microsoft C/C++, 应用程序中是缓冲。 换句话说, 发送到 cout 流信息屏幕上似乎直到其缓冲区被刷新。你的问题应该就在这吧。
cout 类用于缓冲系统数据, 通过使用 endl manipulator 问题可以避免, 但是。 当附加到末尾 cout 调用, endl manipulator 插入换行符并再刷新缓冲区。 endl=flush+“\n”;

#3
lovecsky2007-05-04 01:37
对,版主修改的地方我原来也加了个刷新缓冲区语句,cout.flush();来迫使cout输出,但是不加刷新语句,ch=cin.get()这个函数却可以正确输出。 我觉得ch=cin.get()和ch=getche()没多大差别,除了头文件外。
谢谢版主热心帮忙。
#4
Arcticanimal2007-05-05 17:48
以下是引用lovecsky在2007-5-4 1:37:36的发言:
对,版主修改的地方我原来也加了个刷新缓冲区语句,cout.flush();来迫使cout输出,但是不加刷新语句,ch=cin.get()这个函数却可以正确输出。 我觉得ch=cin.get()和ch=getche()没多大差别,除了头文件外。
谢谢版主热心帮忙。

cin.get和getche应该是有区别的,cin.get 很明显使用了标准输出流,有缓冲,与cin>>ch在实现的方法上是一样的;而getche没有使用标准输出流无缓冲

#5
lovecsky2007-05-05 22:05
我是说两者在使用方法上,头文件不同就应该决定了是否使用了标准流。
getche()是无缓冲显示的,cin.get()是缓冲显示。谢谢楼上的,不过我有一点不明白,为什么要执行完ch=getche(),才开始执行cout,还有ch=getchar()也是。
请楼上的帮忙看一下。
1