理解
参考资料: c++primer,c程序设计语言
在读c++primer以及之前学习 I/O流相关的内容,总是觉得流的概念非常抽象,尤其网上很多博客提到“像水流一样”,很难理解,缺乏具体的感性认识。特别是没有搞清楚iostream和fstream的数据写入、写出方向
c++中的IO库类型和头文件:
头文件 | 类型 |
---|---|
iostream | istream 从流读取数据 |
. | ostream 向流写入数据 |
fstream | ifstream 从文件读取数据 |
. | ofstream 向文件写入数据 |
sstream | istringstream 从string读取数据 |
. | ostringstream 向string写入数据 |
《c程序设计语言》中提到:
流(stream)是与磁盘或其他外围设备关联的数据的源或目的地。
打开一个流,将把该流与一个文件或设备连接起来,关闭流将断开这种连接。
结论
流是 与 磁盘或其他外围设备 关联的 数据的源或目的地。不管是c或是c++,都可以理解为
- 打开一个输入、输出流,就是将该流与文件或设备连接起来
- 打开一个输入、输出流,就是打开 关联设备的 源 或 目的地
解释
输入流总是 作为 所连接设备、文件的 数据源,而输出流总是 作为 所连接设备、文件的 目的地。
-
输入流就是把数据(键盘输入、文件内容、string内容、外围设备)读入到内存(程序)中
数据源 ----> 内存程序 -
输出流就是把内存(程序)中的数据输出(屏幕显示、文件、string)
内存程序 ----> 目的地
总结(持续更新)
- scanf
-
在 scanf 中,从键盘输入的一切数据,不管是数字、字母,还是空格、回车、Tab 等字符,都会被当作数据存入缓冲区。存储的顺序是先输入的排前面,后输入的依次往后排。
-
按回车键的时候 scanf 开始进入缓冲区取数据,从前往后依次取。
-
%d 只识别“十进制整数”。对 %d 而言,空格、回车、Tab 键都是区分数据与数据的分隔符。当 scanf 进入缓冲区中取数据的时候,如果 %d 遇到空格、回车、Tab 键,那么它并不取用,而是跳过继续往后取后面的数据,直到取到“十进制整数”为止。对于被跳过和取出的数据,系统会将它从缓冲区中释放掉。
- 如果 %d 遇到字母,那么它不会跳过也不会取用,而是直接从缓冲区跳出.
- 被跳过或取出的数据,系统会将它一直放在缓冲区中,直到下一个 scanf 来获取。
-
%c,任何数据都会被当作一个字符,不管是数字还是空格、回车、Tab 键它都会取回。
-
参考资料:使用scanf的注意事项