目录
一.文件
二.流
三.输入和输出
二.文件结尾
一.检测方法
二.不同的操作系统,文件结束方式
3.使用scanf检测EOF
一.文件
文件(file)是存储器中存储信息的区域。通常,文件都保存在某种永久存储器中。文件对于计算机系统相当重要
二.流
从概念上看,C程序处理的是流而不是直接处理文件。流是一个实际输入或输出映射的理想化数据流。这意味着不同属性和不同种类的输入,有属性更统一的流来表示。于是,打开文件的过程就是把流与文件相关联,而且读写都通过流来完成。
三.输入和输出
C把输入和输出设备视为存储设备上的普通文件,尤其是把键盘和显示设备视为每个C程序自动打开的文件。stdin流表示键盘输入,stdout流表示屏幕输出。Getchar(),putchar(),printf(),scanf()函数都是标准I/O包的成员来处理这两个流
C是一门强大,灵活的语言,有许多用于打开,读取,写入和关闭文件的库函数。从较低层面上,C可以使用主机操作系统的基本文件工具直接处理文件,这些直接调用操作系统的函数被称为底层I/O。
由于计算机系统各不相同,所以不可能为普通的底层I/O函数创建标准库,ANSI C也不打算这样做。然而从较高层面上,C还可以通过标准I/O报来处理文件。
二.文件结尾
一.检测方法
计算机操作系统要以某种方式判断文件的开始和结束
字符标记文件结尾:在文件末尾放一个特殊的字符标记文件的结尾。在大多数UNIX和Linux系统中,在一行开始处Ctrl+D读取文件结尾信号。许多微信计算机系统都把一行开始处的Ctrl+Z标识为文件结尾信号
存储文件大小的信息:比如文件有3000字节,程序在读到3000字节是便达到文件的末尾。MS-DOS及其相关系统使用这种方法处理二进制文件,因为用这种方法可以在文件中存储所有的字符
EOF:在C语言中,用getchar()读取文件检测到文件结尾时将返回一个特殊的值,即EOF。scanf函数检测到文件结尾时也返回EOF。
EOF定义在stdin.h文件中
#define EOF (-1)
关于为什么要定位为-1,因为getchar()函数的返回值通产都介于0~127(因为getchar()只用于处理字符,而char就是八个字节,为0~255,而ANCII码一般只用0~127)这些值对应标准字符集。所以这种情况下 -1 都不对应任何字符。
这里变量ch为int类型,因为char类型的变量只能表示0~255的无符号整数,但是EOF的值是-1.还好,getchar()函数世界返回值的类型是int,所以它可以读取EOF字符,如果实现使用有符号的char裂隙,也可以把ch声明为char类型(char就算signed char是有符号字符类型),但最好还是用更加通用的形式。但是由于getchar()函数的返回类型是int,如果把getchar()的返回值给char类型的变量,一些编译器会警告可能丢失数据。
二.不同的操作系统,文件结束方式
在UNIX和Linux系统中,在一行开始处按下Ctrl+D来传递文件结束型号。
而windows一半在一行开始处或任意位置的Ctrl+Z解释成文件结尾信号。我的属于前者。
这里不是在开头的Ctrl+Z被解释为ASCII码为26的不可打印的替换字符
在开头的Ctrl+z就能正常识别到文件结束字符
3.使用scanf检测EOF
scanf在遇到错误和文件结尾时会返回-1
这里再两行Ctrl+z才可以正常检测到文件结尾。
scanf无法读取\n,所以需要先去除\n,在读取开头ctrl z才能结束
好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~
如果朋友你感觉文章的内容对你有帮助,可以点赞,关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈