通常,使用标准I/O的第一步是调用fopen()打开文件。fopen()函数不仅打开了一个文件,还创建了一个缓存区(在读写模式下会创建两个缓存区)以及一个包含文件和缓存区数据的结构。另外,fopen()返回一个指向该结构的指针,以便其他函数知道如何找到该结构。假设把该指针赋给一个指针变量fp, 我们说fopen()函数”打开一个流“。如果以文本模式打开该文件,就获得一个文本流;如果以二进制模式打开该文件,就获得一个二进制流。
这个结构通常包含一个指定流中当前位置的文件位置指示器。除此之外,它还包含错误和文件尾的指示器、一个指向缓存区开始处的指针、一个文件标识符和一个计数(统计世纪拷贝进缓存区的字节数)。
我们主要考虑文件输入。通常,使用标准I/O的第二步是调用一个定义在stdio.h中的输入函数,入fscanf()、getc()或fget().一调用这些函数,文件中的数据块就被拷贝到缓存区中。缓存区的大小因实现而异,一般是512字节或是它的倍数,如4096或16384(随着计算机硬盘容量越来越大,缓存区的大小也越来越大)。最初调用函数,除了填充缓存区外,还要设置fp所指向的结构中的值。尤其要设置流中的当前位置和拷贝进缓存区的字节数。通常,当前位置从字节0开始。
在初始化结构和缓存区后,输入函数按要求从缓存区读取数据。在它读取数据时,文件位置指示器被设置为指向刚读取字符的下一个字符。由于stdio.h系列的所有输入函数都使用相同的缓存区,所以调用任何一个函数都会从上一次函数停止调用的位置开始。
当输入函数发现已读完缓存区的所有字符时,会请求把下一个缓存区的数据块从文件拷贝到该缓存区中。以这种方式,输入函数可以读取文件中的所有内容,知道文件末尾。函数在读取缓存区的最后一个字符后,把结尾指示器设置为真。于是,下一次被调用的输入函数将返回EOF。
输出函数以类似的方式把数据写入缓存区。当缓存区被填满时,数据将拷贝值文件中。