流,缓冲区 ungetc 到底有什么意义?

drizztguai 2008-02-16 08:50:04
书上说:
ungetc可以把一个字符退回流中,这样他以后还可以被重新读入.
如果这个函数没有ungetc语句,那么函数不得不把多余的字符返回调用程序,后者负责把它发送到读取下一个字符的程序部分.


疑问一: 函数怎么把这个多余的字符返回程序? 函数不是只return 了 value么? 他退回到了哪个流? 输入还是输出?

疑问二: 退回流中,怎么再读取? 

疑问三: 流是实际存在的物质吗? 我们从键盘输入到 从屏幕输出 是经历这样的步骤么?
键盘输入 --->file打开一个输入流 ---> 键盘开始向流里写内容 ---> 空的缓冲区一次性的从流里读一大片数据.---> 缓冲区满了...

满了怎么办... --->如果这个时候还没有输出的命令, 是输出呢?还是把缓冲区内容先转存在内存里?

输入和输出用的一片缓冲区么?

输出到屏幕 --->从缓冲区直接到屏幕 ? 还是先从缓冲区到输出流 再到屏幕?

好晕! 大家知道我在问什么不... 这个怎么感觉比指针还抽象. 好难解.

 



#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

int
read_int ();

int
main ( void )
{
int a;
char ch;

a = read_int();
printf ("%d%c\n" , a , ch );

return EXIT_SUCCESS;
}

int
read_int ()
{
int value;
int ch;

value = 0;

/*
** 将输入的字符按整型输出.
*/
while ( isdigit ( ch = getchar () ) ){
value *= 10;
value += ch - '0';
}
ungetc ( ch , stdin );
return value;
}
...全文
565 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
drizztguai 2008-02-16
  • 打赏
  • 举报
回复
.~.~ 明白了大概。

情人节的第二天过的也好满足呀 ><!
arong1234 2008-02-16
  • 打赏
  • 举报
回复
疑问一: 函数怎么把这个多余的字符返回程序? 函数不是只return 了 value么? 他退回到了哪个流? 输入还是输出?

返回的是value没错,但是系统还是维持了流的其他信息,只是没返回给你。当然,肯定是退回到输入流
疑问二: 退回流中,怎么再读取? 

没退回怎么读,退回后还怎么读(如getc)

疑问三: 流是实际存在的物质吗? 我们从键盘输入到 从屏幕输出 是经历这样的步骤么?

这里流就是内存内管理输入输出信息的结构

键盘输入 ---> file打开一个输入流 ---> 键盘开始向流里写内容 ---> 空的缓冲区一次性的从流里读一大片数据.---> 缓冲区满了...

和file没啥关系

满了怎么办... ---> 如果这个时候还没有输出的命令, 是输出呢?还是把缓冲区内容先转存在内存里?

流满了输入输出就要失败了,当然,他们本来就在内存

输入和输出用的一片缓冲区么?

有的流是,有的不是

输出到屏幕 ---> 从缓冲区直接到屏幕 ? 还是先从缓冲区到输出流 再到屏幕?

好晕! 大家知道我在问什么不... 这个怎么感觉比指针还抽象. 好难解.

迷糊的东西先不要深究,一开始就弄这个有点过早
drizztguai 2008-02-16
  • 打赏
  • 举报
回复
很流很形象...

有点小感觉了...

那楼上可否解释一下 这个函数如果不用ungetc会产生什么恐怖的效果? :)
Jim_King_2000 2008-02-16
  • 打赏
  • 举报
回复
当然是退回到输入流啦。输出流是无法读的,不存在重新读入的问题。
输入流可以用>>来读取,或者调用istream类的成员函数也可以。
流是一个概念。表示输入或者输出的数据。这样的数据像流水一样被送入你的程序,你的程序的输出也像流水一样出来。
流表示一个按顺序读写的概念。这个概念里面没有“满”这个意思。因为流入的始终等于流出的。只有流缓冲区会满。缓冲区满了之后,缓冲区中的数据会被一次性写入新的目的地。比如cout代表字符终端,它的缓冲区满了,缓冲区中的字符就被显示到屏幕上,同时缓冲区被清空。
这个东西却是不太好理解。建议lz可以看看STL方面的书。比如GENERIC PROGRAMMING AND THE STL:USING AND EXTENDING THE C++ STANDARD或者THE C++ STANDARD LIBRARY。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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