-
8.2 缓冲区
-
有缓冲和无缓冲
-
有缓冲:程序读取输入时先将其放在一个缓冲区,缓冲 I/O 分为行缓冲 I/O 和 完全缓冲 I/O。
-
行缓冲 I/O 指当读取到一个换行符(\n)时将缓冲区刷新(将缓冲区的数据传输到程序中)。
-
完全缓冲 I/O 指当缓冲区满时,刷新缓冲区(将数据传递到程序)。
-
无缓冲:读取一个输入,程序就直接使用这个数据。
-
8.3 结束键盘输入
-
8.3.1 文件、流和键盘输入
- 文件:文件是存储器中存储信息的区域 //文件名即地址
-
某些程序需要读取特定的文件
-
8.3.2 文件结尾
-
1.在文件的最后放一个特殊的字符标记文件的结尾。 // 一般的DOS用Ctrl + z标记文件的结尾.
-
2.记录文件的大小,例如一个文件的大小是4000字节,程序读到4000字节时就达到文件的末尾.
-
在c语言中,用 getchar() 读取文件检测到文件结尾就返回一个特殊的值,即 EOF.(EDF通常被定义为 -1,但一些操作系统也会将其定义为其他的数), //即可以使用EDF 常量来作为文件的结尾,测试的时候输入Ctrl + z即可.
-
// 什么是流
-
C程序处理的是流而不是文件
-
流:统一的分类
- 标准输入流(stdin流)即,输入程序的数据流,可以是一个文件,可以是键盘,鼠标……
- 在c语言中,键盘,鼠标等输入流都可看做一个文件.
-
//忽略空格 , 按下空格只是清除缓冲区(将缓冲区的数据传输进程序中进行处理),并不是程序的结束,![,](https://i-blog.csdnimg.cn/blog_migrate/2087f6e23949b43924204a4aa02cb1da.png)
//这种情况只是因为按下空额然后吧缓冲区的数据送入了程序内处理了,getchar()没有读到代表结束的’#’,所以还是可以继续输入的.
//如果要全部输入完(包括换行)然后再打印,那么直接将处理的每个字符(进入程序的数据)储存在一个字符数组中,当输入结束字符跳出循环后再打印就可以了.
char a,b[50];
int i = 0;
while((a = getchar()) != EOF)
{
b[i] = a;
i++;
}
printf("%s",b);
-
8.4重定向和文件
-
8.4.1 UNIX、Linux、DOS重定向输入、输出
- 重定向符号 : < 或者 >
-
A<T.txt表示将程序A的输入流重定向到文档T中 //A从T.txt中获取输入而不是键盘
-
A>T.txt表示将程序A的输出流重定向到文档T中 //A将程序的返回输入到T.txt中而不是屏幕上
-
不可用于链接两个数据文件或两个程序,不可同时重定向两个输入或输出。
-
>> 运算符可以将输出添加到现有文件的末尾.
-
8.6 输入验证
-
//判断输入的数据是否有效
- 可以将检测输入验证的程序定义为一个函数
long get_long(void)
{
int input;
char ch;
while(scanf("%u",&input) != 1)
{
while((ch = getchar()) != '\n')
putchar(ch);
printf("不是正确的输入,请重新输入");
}
return input;
-
//以下程序计算用户输入范围内的数的平方和,主要检测用户输入的数据是否为有效数据。
#include<stdio.h>
#include<stdbool.h>
long get_long(void);
bool good_input(long begin,long end,long low,long high);
unsigned long sum_squres(long begin,long end);
int main(void)
{
const long HIGH = 10000;
const long LOW = -10000;
long input_a,input_b;
again_input :
printf("请输入范围的下限");
input_a = get_long();
printf("\n请输入范围的上限");
input_b = get_long();
if(good_input(input_a,input_b,LOW,HIGH))
printf("%ld至%ld范围内的数的平方和为%lu"
,input_a,input_b,sum_squres(input_a,input_b));
else
goto again_input;
return 0;
}
long get_long(void)
{
long input;
char ch;
while(scanf("%ld",&input) != 1)
{
while((ch = getchar()) != '\n')
putchar(ch);
printf(" 不是有效的输入,请重新输入");
}
return input;
}
bool good_input(long begin,long end,long low,long high)
{
bool good_input = true;
if(end < begin)
{
printf("下限不能大于上限,请重新输入下限\n");
good_input = false;
}
else if(begin < low)
{
printf("输入的下限超出系统处理的下限,请重新输入\n");
good_input = false;
}
else if(end > high)
{
printf("输入的上限超出系统处理的上限,请重新输入\n");
good_input = false;
}
return good_input;
}
unsigned long sum_squres(long begin,long end)
{
long long sum = 0;
while(begin <= end)
{
sum += begin*begin;
begin++;
}
return sum;
}