C setbuf(python sys.stdinn,BUFF)问题

 上传我的文档
 下载
 收藏
粉丝量:33
该文档贡献者很忙,什么也没留下。
 下载此文档
C Primer Plus编程训练题答案
下载积分:300
内容提示:C Primer Plus编程训练题答案
文档格式:PDF|
浏览次数:30|
上传日期: 21:41:06|
文档星级:
全文阅读已结束,如果下载本文需要使用
 300 积分
下载此文档
该用户还上传了这些文档
C Primer Plus编程训练题答案
关注微信公众号setbuf 的用法?_百度知道
setbuf 的用法?
我有更好的答案
void setbuf(FILE *steam, char *buf); //第一个参数为数据流,一般对文件操作//第二个参数是缓冲区,一般是字符数组
还有什么需要了解的吗,如果没有,希望您采纳一下,谢谢喔!
我还想知道
现在国内公司对招嵌入式人员要求有多高?
主要是linux下嵌入式底层驱动开发
采纳率:62%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C语言问题_百度知道
求代码,然后根据输入的起止字母再输出者图案,则输出此图案。。比如运行程序结果提示“请输入起始字母:“A”,请输入中指字母:“G””如图示,使其中上三角部分的起止字母是输入参数
我有更好的答案
end& scanf(&%c&; printf(& } for&c2) {
printf(&&%c&--) {
int&,&&c&&=& getchar(); printf(&Please&input&-&c1;&
printf(&i&&&nS1;-=&\n&&++)
printf(&quot.c2;&c&nbsp.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http://g.
return&(c&c1;&c&nbsp,&Please&++;
nChar&Print(char&=&c2;&nbsp.com/zhidao/wh%3D600%2C800/sign=dca90b03a60f4bfb8cc8/b0ba61ef678acbe5993.jpg" esrc="http://g.c1;&c&void&);&& char&c; for&(c&=&,&c);++) {
int& }}int&+=&0;0;c1,&c2;&&2;++)
printf(&0;c1);
printf(&i&++)
printf(&&&);
for&(i&=&i&&&nC&i&,&c);&i&&&nC&i&%c&quot. return&0;}&测试结果如下图所示:<a href="http,&&\n&).hiphotos.baidu.com/zhidao/pic/item/b0ba61ef678acbe5993;c1,&char&c2){ int&nSpace&=&--;
for&(i&=&0;main(){ char&&c2); getchar()://g;
nSpace&char:&&); scanf(& int&c2); if&(c1&&Input&error\n&0;
for&(i&=&c2&
nSpace&i&++)
printf(&&&);
for&(i&=& } Print(c1;i&&&nS);&i;nChar&=&%c&quot:&nbsp#include&&stdio.h&i;2;input&start&)
采纳率:73%
来自团队:
&ech););&=&&#39;&&&&&&0;&//计算行数&num/2+1){&&&&&&&&&&&&space&&j&&=&&j&++){&&&&&&&&&&&&printf(&//打印空格数&&&&int&=&&#39;&nbsp,奇数&&&&nbsp:#include&for(i&=&//打印字符数&&&&int&-&2*i&=&2*i&&输入终止字符:&);&&&&scanf(&%c&;&&Z&#39;A&#39;&&&,ch+(chars/2));&&&&&&&&}&num&&&&=&0;for(k&=&&++)&&&&&&&&&&&&printf(&&+&1;&&&&&&&&}&&&&int&num&&&&&-&1;&&&&&&&&}else{&&&&&&&&&&&&space&&&for(j&=&&&输入开始字符:&);&&&&scanf(&%c&;k&&&&=&&&&&&i&&=&&&-&num/2&&0;&&&+&1;&&&&&&&&&&&&chars&&-&i&;&&&&char&ech&&&&&=&i&&&&&&&=&0;&&&&//循环变量&&&&int&&&0;0;-&1;&&&&&&&&&&&&chars&&&-&ch))&*&%c&=&2*num&nbsp。代码如下;printf(&\n&);&&&&}&&((int)(ech&ch&int&j&&&&i++){&&&&&&&&if(i&&=&&&&&&=&0;&&&&int&&&char&2&+&&&&&main(void){&&&&//行数;1;&&nbsp.h&int&&&&&&;&&&&printf(&&nbsp,Windows平台可能不用也可以&nbsp,&ch);&&&&//清楚输入缓存;&&&&i&&&&&=&1;&chars&&&&=&setbuf(stdin,NULL);&&&&printf(&&1;&&&&nbsp我也写了一个,给你多参考一下吧;=&num/2&printf(&\n&);&&&&return&0;}希望这对你有帮助;space&&&&=&&k&&&&k&nbsp
为您推荐:
其他类似问题
您可能关注的内容
c语言的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。酷勤网 C 程序员的那点事!
当前位置: >
浏览次数:次
写这篇短文的起因是,前两天想去天大的acm在线系统找几道题做做。为什么呢?因为本人天大毕业,这个天大呢可是中国最早的大学,原名北洋大学堂,这可绝对是货真价实的第一所大学。给大家推荐推荐啊,学风那是相当的好。
扯多了,还是回到本来的话题上。上了acm系统之后,就先看了1001。那道题的意思是输入一些正整数(以EOF结束),把对应的字符输出。这个简单,程序很快就出来了:
#include&&stdio.h&int&main(){int&c;while(scanf(&%d&,&&c)&!=&EOF){putchar(c);}return&<span style="COLOR: #;}
程序运行,输入103 102 105 107&enter&
输出gfik。
当时运行完之后马上想,为什么不是输入一个数字马上输出一个字符呢,因为看程序确实是这样的逻辑,只要不是EOF,就会输出。又一想,对了,是缓冲的问题。想起来APUE里边说得stdin应该是行缓冲的,另外,可以用setbuf,setvbuf设定流的缓冲。于是想将stdin设成无缓冲的。于是程序变成这样:
#include&&stdio.h&int&main(){int&c;setbuf(stdin,&NULL);while(scanf(&%d&,&&c)&!=&EOF){putchar(c);}return&<span style="COLOR: #;}
可是编译运行,还是老样子,没有变化。想了想,没想出是啥原因,于是开始google和APUE。终于算是明白了些,整理在这儿。
本文很大部分内容来自APUE--UNIX环境高级编程。
1. 缓冲类型。
标准库提供缓冲是为了减少对read和write的调用。提供的缓冲有三种类型(整理自APUE):
在这种情况下,实际的I/O操作只有在缓冲区被填满了之后才会进行。对驻留在磁盘上的文件的操作一般是有标准I/O库提供全缓冲。缓冲区一般是在第一次对流进行I/O操作时,由标准I/O函数调用malloc函数分配得到的。
术语flush描述了标准I/O缓冲的写操作。缓冲区可以由标准I/O函数自动flush(例如缓冲区满的时候);或者我们对流调用fflush函数。
在这种情况下,只有在输入/输出中遇到换行符的时候,才会执行实际的I/O操作。这允许我们一次写一个字符,但是只有在写完一行之后才做I/O操作。一般的,涉及到终端的流--例如标注输入(stdin)和标准输出(stdout)--是行缓冲的。
标准I/O库不缓存字符。需要注意的是,标准库不缓存并不意味着操作系统或者设备驱动不缓存。
ISO C要求:
当且仅当不涉及交互设备时,标准输入和标准输出是全缓存的。
标准错误绝对不是全缓存的。
但是,这并没有告诉我们当标准输入/输出在涉及交互设备时,它们是无缓存的还是行缓存的;也没有告诉我们标准错误应该是行缓存的还是无缓存的。不过,大多数实现默认的缓存类型是这样的:
标准错误总是无缓存的。
对于所有的其他流来说,如果它们涉及到交互设备,那么就是行缓存的;否则是全缓存的。
<span style="COLOR: #. 改变默认缓存类型
可以通过下面的函数改变缓存类型(摘自APUE):
void setbuf(FILE *restrict fp, char *restrict buf);int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);
这些函数必须在流打开之后、但是未对流做任何操作之前被调用(因为每个函数都需要一个有效的文件指针作为第一个参数)。
利用setbuf,可以打开或者关闭缓存。为了打开缓存,buf参数必须一个大小为BUFSIZ的缓存,BUFSIZ是定义在stdio。h中的常量。&&ISO/IEC 9899&&要求:BUFSIZ至少为256。如果要关闭缓存,可以将buf设成NULL。
利用setvbuf,我们可以设定缓存类型。这是通过mode参数指定的。
关于这两个函数,可以看下表(摘自APUE):
user buf of length BUFSIZ
fully buffered or line buffered
(no buffer)
unbuffered
user buf of length size
fully buffered
system buffer of appropriate length
user buf of length size
line buffered
system buffer of appropriate length
(no buffer)
unbuffered
需要注意的是:如果在函数内为流分配了自动变量作为缓存,那么在退出之前需要将流关闭。因此最好让系统自己分配缓存,这些缓存在流关闭的时候会自动被释放。
<span style="COLOR: #.如果清理输入缓存
关于这点可以参看comp.lang.c FAQ的Question12.26b:
Q: If fflush won"t work, what can I use to flush input?A: It depends on what you"re trying to do. If you"re trying to get rid of an unread newline or other unexpected input after calling scanf (see questions 12.18a-12.19), you really need to rewrite or replace the call to scanf (see question 12.20). Alternatively, you can consume the rest of a partially-read line with a simple code fragment likewhile((c = getchar()) != "
" && c != EOF)/* discard */ ;(You may also be able to use the curses flushinp function.)There is no standard way to discard unread characters from a stdio input stream. Some vendors do implement fflush so that fflush(stdin) discards unread characters, although portable programs cannot depend on this. (Some versions of the stdio library implement fpurge or fabort calls which do the same thing, but these aren"t standard, either.) Note, too, that flushing stdio input buffers is not necessarily sufficient: unread characters can also accumulate in other, OS-level input buffers. If you"re trying to actively discard input (perhaps in anticipation of issuing an unexpected prompt to confirm a destructive action, for which an accidentally-typed ``y"" could be disastrous), you"ll have to use a system-specific technique to detect the presence of typed- see questions 19.1 and 19.2. Keep in mind that users can become frustrated if you discard input that happened to be typed too quickly.References: ISO Sec. 7.9.5.2H&S Sec. 15.2
<span style="COLOR: #. 几点需要注意的地方
对输入流进行fflush操作是无定义的。
无缓存并不意味着一个个的那样处理输入,而是说当操作系统返回它们时,对于标准库函数来说它们是立即可用的。因为还可能有操作系统级甚至是硬件级的缓存,这些并不是setbuf可以控制的。
另外可以参考(我就是最先从这里开始看的)。还有。我从后面那个链接摘录一些重要的下来:
setbuf() has to do with the delivery of bytes between theC library FILE* management layer and the OS I/O layer.
Calls to fread(), fgets(), fgetc(), and getchar() work withinwhatever FILE* buffered data is available, and when that datais exhausted, the calls request that the FILE* buffer be refilledby the system I/O layer.
When full buffering is turned on, that refill operation results in theFILE* layer requesting that the operating system hand it a fullbuffer" when buffering is turned off, thatrefill operation results in the FILE* layer requesting that theoperating system return a single character.
...setting an input stream to be unbuffereddoes NOT tell the operating system to tell the device driverto go into any kind of &raw& single-character mode. There aresystem-specific calls such as ioctl() and tcsetterm() thatcontrol what the device driver will do.
& 相关主题:下次自动登录
现在的位置:
& 综合 & 正文
【c语言】清空缓存 的问题
我们使用函数向某个文件从当前流标签所在位置,读取n个字符。我们也会使用函数想文件的某个流位置写如n字符。但是,当这种写的动作小、而频繁。每次写又必须反映到硬盘上,也就是说需要频繁的操作硬盘,写一些小的更改,这是非常耗损效率。所以自然我们想到了,我们设立一个缓冲区,将那些要写如的数据先写到缓冲区中,当缓冲区满,或者其他情况发生的是否,我们在一起将他们写入到硬盘上。这样可以大大提高应用程序读写文件的速度。
这就是为什么需要缓冲,根本原因我认为是磁盘等外设的数据还和内存的速度相差甚远,所以我们不希望由于操作外设的原因让本来很快的内存和CPU跟着一起慢,我们想的办法:一是异步写(但这有时候不能符合应用要求),二就是缓冲读写。
而我们通常所理解的就是,read体系,就是那种无缓冲读写,不管是读还是写,调用这个体系的函数,会马上启动一次外设操作,读取数据或者写入数据。而fread体系则,使用了缓冲读写的方式,一定时间才调用read体系的函数。
清空stdin中的缓存
while((c = getchar()) != EOF && c != '\n');
会把缓存清空,但是会遗留下'\n'
读取时,可以使用 scanf("%[^\n]",c);来空过\n。
或 scanf("\n%d",c);
失败的解决方案:
while(!feof(stdin)){
  getchar();
结果:程序会卡在这段,永远出不了while循环。
因为feof(FILE* file )函数必须等下一次读取不到数据使,才会返回非0;如读取空文件时,直接用feof(file)返回的是0,而用一下
fread()函数后,虽然什么都没有读到,但是feof(file)就返回非0了;
所以就会造成虽然到了结尾了,但是feof(stdin)返回的还是0,然后程序就会卡在getchar(),等待输入。
fflush(stdin);
//使用后无效,查了一下,此函数不是标准函数,VC编译器可以使用,但是其他的编译器如gcc是不支持的(注:fflush(stdout)是标准函数)
linux下是刷新缓存,在VC下是清除缓存
while((c = getchar()) != EOF && c != '\n');此时缓冲区第一个字符是'\n'。
scanf("%*[\n]%d",c);
此时c读取的是\n,没有读到后面的输入,导致程序错误。
没想明白为什么,%【\n】不是读到第一个非\n时停止吗,加上星号忽略这个,然后%d就可以读到输入。但是结果不对,请大侠解答谢谢!
用setbuf(stdin, NULL);清空缓存
setbuf的函数原型是
void setbuf(FILE*stream
,char *buf);
事实上,read体系也有自己的缓冲机制,但是我们可以通过设置(open函数中DIRECT标志),放弃这种方式。
我们可以说,fread是在用户应用程序空间中,自己建立了一个缓冲机制,这种缓冲机制和内核read的缓冲机制并不冲突。
事实上,当我们使用read体系的是否,我们放弃了应用程序空间中的缓冲机制,但是如果不设置DIRECT标志,内核中的缓冲机制依然存在。
我们还有一种特殊的读写应用程序,叫着自缓冲读写,其实fread就是这样一种方式。只是它没有放弃内核的缓冲机制。但是对于复杂应用程序,例如数据库,这种对读写效率要求高的地方,他们使用了自己定义缓冲机制并且毅然放弃了内核的缓冲方式,为什么呢?因为内核缓冲方式,对缓冲数据何时应该存入到硬盘上,那些数据应该留下来更久没有应用背景相关的信息,所以它所出来的决策,通常是盲目的。但是,如果应用程序自己设置这种缓冲,可以很大程度上弥补这一问题。
缓冲I/O绝对有它的好处,这种机制的使用不仅在用户空间中,也在内核实现时会使用。当然有是否我们为了最求某些特别的需求,会使用直接I/O方式。当然事实上,这种I/O方式,与缓冲与否不是对立的。但是往往这样做了之后,缓冲就不够。我们要使用直接I/O要慎重考虑,你应用程序的需求,例如,你需要存取大块数据。这个是否“多拷贝”无疑是一个问题。 其中取舍需要仔细考虑、权衡。
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 fflush stdin 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信