运行C程序时,Linux内核会为每个文件分配一个结构体,记录该文件的信息,该结构体可以表示为:
struct File {
缓冲区的位置(用来存放文件内容)
缓冲区中当前字符的位置
文件的读写状态
是否达到文件的结尾
......
}
所以创建一个文件指针也可以说是创建一个该结构体的指针(以下都表述为文件指针):
File *fp;
可以用fopen函数来打开一个文件,其定义如下:
File *fopen(char *name, char *mode);
该函数第一个参数是要打开的文件名,第二个参数是访问模式,"w"表示写,"r"表示只读,"a"表示追加,如果是"wb","rb",”ab"则对应的文件是二进制文件。
以下是一些文件访问的函数:
char getc(File *fp)
该函数返回fp所指向的输入流中当前指向的字符,并指向下一位置,如果到达文件结尾或出错,则返回EOF。
char putc(char c, File *fp)
该函数将字符写入文件中并将原本指向字符的位置移动下一位置,如果发生错误,则返回EOP。
启动一个C语言程序是,操作系统会创建3个文件,并为它们分配3个文件指针stdin,stdout,stderr,3个指针在<stdio.h>中声明。这3个文件叫标准输入文件、标准输出文件、标准错误文件。stdin指向键盘(因为对键盘进行输入时会写入该文件),stdout和stderr指向显示器。
现在先看两个函数:
头文件:#include <stdio.h>
函数getchar()用于从标准输入控制台(显示器)读取字符,原型如下:
int getchar(void);
【参数】该函数没有参数。
【返回值】函数的返回值为用户输入的第一个字符的ASCII码,若出错返回-1,且将用户输入的字符回显到屏幕。如果用户在按回车键之前输入了不只一个字符,其他字符会保留在键盘缓冲区中,等待后续getchar()调用读取。也就是说,后续的getchat()调用不会等待用户按键,而是直接读取缓冲区中的字符,直到缓冲区的字符读取完毕后,才等待用户按键。
头文件:#include <stdio.h>
函数putchar()用于将给定的字符输出到控制台(显示器),其原型如下:
int putchar (int ch);
【参数】ch为要输出的字符。
【返回值】输出成功,返回该字符的ASCII码值,否则返回EOF。
getchar()、putchar()可以通过stdin、stdout、getc()和putc()定义:
#define getchar() getc(stdin)
#define putchar() putc(stdout)
所以getchar()和putchar()实际上是宏而不是函数,同理,其实getc()和putc()也是宏。
下方是一个文件内容拼接的程序:
文件指针stdin、stdout和stderr都是常量,因此不能给它们赋值。
当我们停止对文件的操作是,会调用fclose()该程序与外部文件的连接,并使其不再指向该文件(所以该指针可以重复使用)。另一个作用是将缓冲区中的内容写到文件中。实际上,程序在结束时会自动调用fclose().