为什么每次C程序运行的时候总是需要按下Enter键才有效呢??
首先了解下两种缓存输入定义:
1、完全缓存输入:
当缓存区被填满时才刷新缓冲区(内容发送到目的地),通常出现在文件输入中。
2、行缓存输入:
指的是出现换行符才刷新缓冲区,键盘通常就是行缓存输入,所以按下Enter键后才刷新缓存区。
所以我们的C程序,每次都是等到了Enter键按下之后,才开始后面数据的获取,这个就是上面所说的行缓存输入。
常见处理字符输入、输出的有<strong>getchar、putchar、printf和scanf</strong>等,这些都是专门处理字符的输入和输出函数,这些不需要我们定义,只要C程序开头包含了头文件<strong>stdio.h</strong>,即可使用。
需要注意的地方,每当用户按下了Enter时,都会多传递一个换行符。
getchar与EOF使用
#include<stdio.h>
int main(){
int ch;
while((ch=getchar())!=EOF){
printf("hello");
}
return 0;
}
如下,若输入一个 1 再按回车键,会输出 两个 “hello”; 因为getchar会读取 1 和 回车键
上面这个实例,不管你按了多少次的Enter键,都会继续运行下去,因为Enter换行符,不等于 EOF。
EOF定义:
EOF是C语言中,当检测某个文件到结尾时,将返回一个特殊的值,即EOF(end of file的缩写),getchar和scanf都会这样返回。其实EOF可以理解为一个值,标志着检测到了文件结尾,并不是在文件中能找得到符号。
可以在stdio.h中查看
#define EOF -1
被定义成了-1,不过不同的系统定义的值可能不同。
读取文件案例
#include<stdio.h>
#include<stdlib.h>
int main(){
FILE * fp;
int ch;
char fname[50];
scanf("%s",&fname);
fp = fopen(fname,"r");//打开读取文件
if(fp==NULL){
printf("打开文件失败");
exit(1);
}
while((ch=getc(fp))!=EOF){
printf("%s",&ch);
}
fclose(fp);
return 0;
}
这下图是我的代码目录结构
以上是我对C部分IO的总结,如有错误,还望指正。