8.1 单字符i/o:getchar()和putchar()
8.2 缓冲区
无缓冲输入:用户输入字符后,立即打印
缓冲输入:用户输入的字符被收集并储存在一个被称为缓冲区的临时存储区,按下Enter后,程序才可以使用用户输入的字符。
缓冲分为:完全缓冲I/O和行缓冲I/O。
完全缓冲I/O:缓冲区被填满时才刷新缓冲区。
行缓冲I/O:出现换行符时刷新缓冲区。
8.3 结束键盘输入
8.3.1 文件、流、键盘输入
文件:存储器中储存信息的区域。
流:实际输入/输出映射的一个理想化数据流。
8.3.2 文件结尾
1:以ctrl+z字符来标记文件结尾。
2:储存文件大小的信息。
c语言中getchar()读取到文件检测到文件结尾时将返回一个特殊的值即EOF(end of file)scanf()函数检测到结尾也返回EOF。
通常EOF定义在stdio.h文件中:
#define EOF (-1)
使用键盘输入EOF:要使用Ctrl+Z或Ctrl+D
8.4 重定向和文件
8.4.1 unix、linux、dos重定向
1.重定向输入
例:echo_eof<word echo_eof是一个可执行文件,word是一个文本文件。该目的是用文件替换键盘输入。
2.重定向输入
例:echo_eof>word 该目的是键盘读取的数据输出到word文件中。
3.组合重定向
echo_eof<myword>saveword 等同与echo_eof>saveword<myword.
遵守原则:
重定向运算符连接一个可执行文件和一个数据文件
不能读取多个文件的输入/输出
通常文件名和运算符之间的空格不是必须的。
8.5 创建更友好的用户界面
5.5.1 使用缓冲输入
例:当输入非‘y’的字符时,程序会打印一次“111111111”,但实际上打印了两次,程序读取输入字符后判断,然后还将换行符读取进行了一次判断。
while(getcha()!='y') { printf("1111111111")
/*改变方法
while(getchar()!=' ')
continue;
*/ }
8.5.2 混合数值和字符输入
当同时使用scanf和getchar时,scanf读取数字会跳过空格。
8.10 复习题
3.
#include<stdio.h> int main() { int ch; int i=0; while (getchar()!=' ') { i++; } putchar(i); return 0; }
8.11 编程练习
2.
#include<stdio.h> int main() { int ch, i=0; for ( i = 1; (ch=getchar())!=EOF; i++) { if (ch>=' '|| ch==' '||ch==' ')//32空格是一个界限,小于32的都是控制字符。 { printf("%-5c",ch); } else { printf("^%-4c",ch+64); } printf("%-5d",ch); if (i%10 == 0) { printf(" "); } } return 0; }
3.
#include<stdio.h> #include<ctype.h> int main(void) { int ch,i=0,j=0; while ((ch=getchar())!=EOF) { if (islower(ch)) { i++; } else if (isupper(ch)) { j++; } if (ch==' ') { printf("大写%d,小写%d",j,i); } } return 0; }
4.
5.理解二分法,当选择大于时要修该max,选择小于要修改min。
#include<stdio.h> #include<ctype.h> #include<stdbool.h> int main (void) { float num=50; bool bingo =false; int i=0; float max=100,min=0; while (!bingo) { printf("number is %.2f ",num); printf("1.大了,2.小了,3.猜对了 "); if ((scanf("%d",&i)==1)&&(i>=1&&i<=3)) { switch (i) { case 1: max=(min+max)/2; num=(min+max)/2; break; case 2: min=(min+max)/2; num=(min+max)/2; break; case 3: max=(min+max)/2; num=(min+max)/2; break; } } else { printf("请输入正确格式 "); } } return 0; }
6.
#include<stdio.h> #include<ctype.h> #include<stdbool.h> int main (void) { int ch; bool bingo=false; while (!bingo) { ch=getchar(); if(!isblank(ch)) { bingo=true; printf("第一个非空字符为%c",ch); } } while (getchar()!=' ') continue; getchar(); return 0; }
------------恢复内容结束------------