读取/写入 相对于文件而言
输入/输出 相对于程序/内存而言
一切皆文件,键盘、显示屏也是文件,只不过是特殊的标准文件;
标准文件:标准输入、标准输出、标准错误;---->对应的文件指针: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代表正确读写;(文件)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
函数
函数原型
参数说明
返回值
说明