文件I/O和标准I/O函数

时间:2021-01-01 14:12:54

读取/写入  相对于文件而言

输入/输出 相对于程序/内存而言

一切皆文件,键盘、显示屏也是文件,只不过是特殊的标准文件;

标准文件:标准输入、标准输出、标准错误;---->对应的文件指针:stdin、stdout、stderr;--->键盘、显示器

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

二进制与文本:

 大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码。)

参考链接

文本文件与二进制文件的区别: https://www.cnblogs.com/pengwangguoyh/articles/3223072.html

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

标准I/O的机理:

研究一个典型的概念模型,分析标准I/O的工作原理。

调用fopen()打开文件(C程序会自动打开3中标准文件)。fopen()函数不仅打开一个文件,还创建了一个缓冲区(读写模式下会创建两个缓冲区)以及一个包含文件和缓冲区数据的结构。fopen()返回一个指向该结构的指针,以便其他函数知道如何找到该结构。

       假设如果把该指针赋给一个指针变量fp,我们说fopen()函数“打开一个流”。如果以文本的形式打开该文件,就获得一个文本流。如果以二进制形式打开该文件,就获得一个二进制流。

       这个结构通常包含一个指定流中当前位置的文件位置指示器。除此之外,它还包含错误文件结尾指示器、一个指向缓冲区开始处的指针、一个文件标识符、一个计数(实际拷贝进缓冲区的字节数)。

       第二步就是调用定义在stdio.h中的输入函数,文件中的数据块就被拷贝到缓冲区中。缓冲区的大小因实现而异。一般是512字节或是它的倍数。除了填充缓冲区外,这些输入函数还要设置fp所指向的结构中的值。尤其是设置流中的当前位置和拷贝进缓冲区的字节数。这个步骤叫做初始化结构和缓冲区。

       之后按要求从缓冲区读取数据。在它读取数据时,文件位置指示器被设置为指向刚读取字符的下一个字符。由于stdio.h系列的所有输入函数都使用相同的缓冲区,所以调用任何一个函数都将从上一次函数停止调用的位置开始。

       当输入函数发现已经读完缓冲区中的所有字符时,会请求把下一个缓冲区大小的数据块从文件拷贝到该缓冲区中。以这种方式,输入函数可以读取文件中所有的内容,直到文件结尾。函数在读取缓冲区中的最后一个字符后,把结尾指示器设置为真。于是,下一次被调用的输入函数将返回EOF。

       输出函数以类似的方式把数据写入缓冲区。当缓冲区被填满时,数据将被拷贝至文件中。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

何为文件指针:

 在C语言中使用一个指针变量指向一个文件,这个指针被称为文件指针。

定义一个文件指针: FILE *指针变量标识符

FILE应该为大写,它实际上是系统定义的一个结构。编写程序时,不必关系结构的实现细节。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

标准I/O函数总览:

fopen()函数:打开文件;(文件)

fclose()函数:关闭文件;(文件)

getc()函数:从指定文件读取一个字符;(字符)

putc()函数:写入一个字符到指定文件;(字符)

getchar()函数:从标准输入文件读取一个字符;(字符)

putchar()函数:写入一个字符到标准输入文件;(字符)

fprintf()函数:写入到指定文件,输出到文件、带转换说明;(字符串)

fscanf()函数:从指定文件读取,输入到程序、带转换说明;(字符串)

printf()函数:写入到标准输出文件,输出到标准输出文件,带转换说明;(字符串)

scanf()函数:从标准输入文件读取,从标准输入文件输入到程序,带转换说明;(字符串)

fgets()函数:从指定文件读取字符串,带字符串大小参数;(字符串)

fputs()函数:写入字符串到指定文件,带字符串大小参数;(字符串)

gets()函数:这个函数不安全,容易造成内存溢出,被摒弃了;(字符串)

puts()函数:写入字符串到标准输出设备,输出字符串到标准输出设备;(字符串)

fseek()函数:设置文件指针stream的位置;(文件)

ftell()函数:得到文件位置指针当前位置相对于文件首的偏移字节数;(文件)

fsetpos()函数:设置文件指针stream的位置,对于大文件;(文件)

fgetpos()函数:得到文件位置指针当前位置相对于文件首的偏移字节数,对于大文件;(文件)

fread()函数:二进制方式,从一个文件读数据到另一文件;(二进制)

fwrite()函数:二进制方式,从一个文件写输入到另一个文件;(二进制)

exit()函数:退出程序,返回操作系统用的。exit(0)表示正常退出,exit(x)(x不为0)都表示异常退出,这个x是返回给操作系统(包括UNIX,Linux,和MS DOS)的,以供其他程序使用。

rewind()函数:void rewind(FILE * stream);用于将文件指针重新指向文件的开头。

setvbuf()函数:创建了一个供标准I/O函数替换使用的缓冲区。

fflush()函数:引起输出缓冲区所有未写入的数据被发送到fp指定的输出文件。这个过程被称为刷新缓冲区。(针对输出流)

feof()函数:表明是否是文件结尾,0代表是文件结尾;(文件)

ferror()函数:表明是否读写错误,0代表正确读写;(文件)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

函数

函数原型

参数说明

返回值

说明