一、C程序中要包含stdio.h头文件才可以直接使用putchar()、getchar()(其实,getchar()和putchar()都不是真正的函数,它们被定义为供预处理器使用的宏)、printf()函数,scanf()函数,它们都是C语言标准I/O包的成员。
二、ANSI C 和后续的C标准都规定输入是缓冲的。缓冲区的大小取决于系统,常见大小512字节和4096字节。
缓冲分为两类,完全缓冲I/O和行缓冲I/O。
完全缓冲输入指的是当缓冲区被填满时才刷新缓冲区(内容被发送到目的地《比如说C程序》),通常出现在文件输入中。
行缓冲I/O指的是在出现换行符时刷新缓冲区。键盘输入通常是行缓冲输入,所以在按下 Enter键后才刷新缓冲区。
三、从概念上看,C程序处理的是流而不是直接处理文件。流(stream)是一个实际输入或输出映射的理想化数据流。这意味着不同属性和不同种类的输入,由属性更统一的流来表示。于是。打开文件的过程就是把流与文件相关联,而且读写都由流来完成。
C把输入和输出设备视为存储设备上面的普通文件,尤其是把键盘和显示设备视为每个C程序自动打开的文件。stdin流表示键盘输入,stdout流表示屏幕输出。putchar()、getchar()函数、printf()函数,scanf()函数处理这两个流。
无论操作系统使用何种方法检测文件结尾,在C语言中,用getchar()读取文件检测到文件结尾时将返回一个特殊的值,即EOF(end of life),scanf()函数检测到文件结尾时也返回EOF。
通常EOF定义在stdio.h中;#define EOF (-1) ----这表示EOF是一个明示常量(manifest constant)(也叫作符号常量)。
#define EOF (-1) 待写
也叫宏,宏的名称中不允许有空格,而且必须遵循C变量的命名规则:只能使用字符、数字和下划线(_)字符,而且首字符不能是数字。
Linux,UNIX风格模拟文件结尾(按下Ctrl+D),在Windows PC中,要按下Ctrl+Z。
#include <stdio.h>
int main(void)
{
int ch; //用int类型的原因是EOF的值是-1,而无符号的char类型就读取不了EOF,
//getchar()函数的返回类型是int,虽然说将ch声明为unsigned char类型也行,但是将ch声明为int类型更通用
printf("%d\n",EOF);
while((ch = getchar()) != EOF) //这一行也可以写while((scanf("%c",&ch)) != EOF)
putchar(ch);
return 0;
}
运行截图如下:
.
四、重定向和文件
重定向运算符:(< 和 >)
上面的程序还有查看文件内容,创建一个新文件,拷贝文件的潜力
重定向输入让程序使用文件而不是键盘来输入,重定向输出让程序输出至文件而不是屏幕
1、重定向输出至文件,同目录下不存在这个文件就会创建一个新文件。
若同目录下重定向输出所对应的文件已经存在,则通常会擦除该文件的内容,然后替换新的内容。
如图:
.
2、重定向输入使用文件,查看文件内容
.
3、拷贝文件(用到了组合重定向)
拷贝文件a.txt 并生成新文件 b.txt
注意:组合重定向中命令和重定向运算符的顺序无关
注意:输入文件名和输出文件名不能相同
—原因:重定向输出至文件之前,原文件已导致原文件的长度被截断为0。
不管是组合重定向还是单个方向的重定向,都有一些规则需要遵守:
①:重定向运算符连接一个可执行程序(包括标准操作系统命令)和一个数据文件,不能用于连接一个数据文件和另一个数据文件,也不能用于连接一个程序和另一个程序。
②:使用重定向运算符不能读取多个文件的输入,也不能把输出定向至多个文件。
③:通常,文件名和运算符之间的空格不是必须的,除非是偶尔在UNIX shell,Linux shell 或 Windows 命令行提示模式中使用的有特殊含义的字符。
另外两点值得注意(就是上面两个标黄的注意)
④:组合重定向中命令和重定向运算符的顺序无关
⑤:输入文件名和输出文件名不能相同