c语言笔记——对流的理解

Posted by 尹傲雄 on January 1, 2017   

  问题的开始是因为在编程的时候在输入数据的时候出现的一点问题,当时的问题大致可以总结为下面的代码:

int a=0;
char b[10];
scanf("%d",&a);
gets_s(b);
printf("%d%s",a,b);

当时的效果就像是gets_s这个函数被跳过去了一样没有输出结果,没有任何的反应显得十分的诡异,但是调试的时候发现其实并不是被跳过去了,而是gets_这个函数直接获得了一个\0,结束了输入。然后就是查资料了,然后就知道了有输入缓冲区这个东西(其实我原来也知道至少没有深入了解不知道有什么用,看样子要被坑了才会有动力),然后有了解的流这个概念,以及各个输入函数之间的区别什么的。

  先说一说流这个概念,这是一个重要而又比较抽象的概念,不仅仅在c语言里有在很多的地方都会用到。K&R 在 C Programming Language 书中提到流是这样定义的:

流 (stream) 是与磁盘或其它外围设备关联的数据的源或目的地。

流可以理解为是程序外界进行数据交流的一种抽象,程序通过流对外界进行数据的输入和输出。因为c语言把文件看作是一串有序的字符序列,然后读取的时候就是一个字符一个字符的有序的‘流’过去,是不是一个非常形象的比喻啊。就像日常生活种的水一样,水的流动有它最基本的单位那就是水分子。而这里提到的流最小的单位一般是字节流(二进制流)和字符流(文本流),因为字节是最终储存在计算机中的基本单位,而字符是最终展现给人类看的基本单位。   那么为什么需要有这样一种概念的提出呢?我觉的最终是为了程序的可移植性,通过对流的定义我们可以看到,磁盘中的文件和其他的外围设备是等价的。这样程序在对这些物理实体进行操作就像是对文件进行数据的输入输出操作一样,这样对与编程就十分的有利,而且程序具有非常好的可移植性也就是通用性。   先写到这里,下一篇写再写缓冲区什么的。这是我的一点理解(其实还是有很多不理解的地方),有不对的地方希望大家可以帮忙指正出来,谢谢大家了。