免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5004 | 回复: 26
打印 上一主题 下一主题

关于行缓存??? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-04-17 11:18 |只看该作者 |倒序浏览
一个简单的程序,如下:
int main()
{
     char ch;
     while (1) {
           printf("please choose 0.quit  1.aa   2.bb";
           scanf("%c",&ch);
           if (ch=='0') {
                 printf("----choose 0\n";
                 break;
           }
           switch (ch){
                 case '1':  printf("----choose 1\n";break;
                 case '2':  printf("----choose 2\n";break;
                 default:   printf("----bad choose\n";
           }
      }
}

运行结果是:
please choose 0.quit 1.aa 2.bb      (假设输入1)
则显示如下:
----choose 1
please choose 0.quit 1.aa 2.bb----bad choose
please choose 0.quit 1.aa 2.bb    (等待输入)

为什么会出现这样的结果?

论坛徽章:
0
2 [报告]
发表于 2003-04-17 11:42 |只看该作者

关于行缓存???

读入了一个换行符

论坛徽章:
0
3 [报告]
发表于 2003-04-17 12:57 |只看该作者

关于行缓存???

[quote]原帖由 "blublusky"]读入了一个换行符[/quote 发表:

我也觉得可能是多读了一个换行符的缘故,可是,多读了哪一个了?你能不能说得详细一点呢?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-04-17 13:44 |只看该作者

关于行缓存???

是没有flush缓存的缘故,在while(1)后面加入如下的代码:
fflush(fileno(1));
fflush(fileno(2));

论坛徽章:
0
5 [报告]
发表于 2003-04-17 14:19 |只看该作者

关于行缓存???

但我还是不懂为什么取一个字节,缓冲区还是会影响,请教

论坛徽章:
0
6 [报告]
发表于 2003-04-17 14:19 |只看该作者

关于行缓存???

蓝色键盘,果然是没有刷新的缘故呢!呵呵,谢谢了!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2003-04-17 16:53 |只看该作者

关于行缓存???

[quote]原帖由 "一颗流星"]蓝色键盘,果然是没有刷新的缘故呢!呵呵,谢谢了![/quote 发表:

你观察一下我写过的所有代码,就会发现我从来都不用 printf(). 我只用 fprintf( stderr, ... ); 因为 stderr 就不会有这个问题。

论坛徽章:
0
8 [报告]
发表于 2003-04-18 10:59 |只看该作者

关于行缓存???

原帖由 "flw" 发表:

你观察一下我写过的所有代码,就会发现我从来都不用 printf(). 我只用 fprintf( stderr, ... ); 因为 stderr 就不会有这个问题。


改成下面这样,还是会出现同样的问题, 请问如何解决,
蓝色键盘提到的方法试了不行。。


  1. #include <stdio.h>;

  2. int main(void)
  3. {
  4.                 char ch;
  5.          
  6.                 while(1) {
  7.                         fprintf(stderr, "choice:\n0.quit\n1.aa\n2.bb\nchoose-->;");
  8.                         scanf("%c",&ch);
  9.                
  10.                         fprintf(stderr, "ch = [%c]\n", ch);
  11.                
  12.                         if ('0' == ch) {
  13.                                 fprintf(stderr, "----choose 0\n");
  14.                                 exit(0);
  15.                         }       
  16.                  
  17.                         switch (ch){
  18.                                 case '1': fprintf(stderr, "----choose 1\n");break;
  19.                                 case '2': fprintf(stderr, "----choose 2\n");break;
  20.                                 default: fprintf(stderr, "----bad choose\n");break;
  21.                         }
  22.                
  23.                         fprintf(stderr, "\n");
  24.                 }
  25.        
  26.                 return(0);
  27. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2003-04-18 11:11 |只看该作者

关于行缓存???

在我列出的例子中,用了fflush强制刷新,是可以得。
但是,在我的另外一个程序中,刷新了仍然不好用,是不是跟还行符有关呢?

论坛徽章:
0
10 [报告]
发表于 2003-04-18 12:55 |只看该作者

关于行缓存???

stderr
标准错误流
stdout
标准输出流
虽然stderr一般也是显示在stdout的
但是从程序设计的角度来说
正确的输出应该使用stdout
错误输出应该使用stderr

运行程序时可以使用
程序 >;txt把stdout内容打印到txt文件中
但是要把stderr也打印到文件中
必须使用
程序 >;txt 2&>;1
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP