C文件系统由若干互相联系的函数构成,这类函数要求包含头文件<stdio.h>。常用的缓冲文件系统函数有:
fopen():打开一个文件
fclose():关闭一个文件
putc(),fputc():向文件写一个字符
getc(),fgetc():从文件中读取一个字符
fgets():从文件中读一字串
fputs():写字串到文件
fseek():写文件中定位于特定字节
ftell():返回当前文件位置
fprintf():与文件的关系和pritnf()与控制台的关系相同
fscan():与文件的关系和scanf()与控制台的关系相同
feof():到达文件结尾时返回真值(true)
ferror():发生错误时返回真值(true)
rewind():把文件的定位指示置回文件开始处
remove():删除一个文件
flush():对一个文件清仓
头文件<stdio.h>提供I/O函数的原型,同时定义size_t, fpos_t和FILE三个类型。类型size_t和fpos_t本质上与unsigned一样。
<stdio.h>还定义了若干宏,如NULL,EOF,FOPEN_MAX,SEEK_SET,SEEK_CUR和SEEK_END。宏NULL定义为空指针。宏EOF一般定义为-1,作为输入函数读过文件尾时的返回值。FOPEN_MAX定义整型值,用以确定在任何时刻可以打开的文件数目。其他宏和fseek()一起作用,对文件实施随机访问。
文件指针(file pointer):是贯穿缓冲I/O系统的主线。文件指针是指向定义文件操作信息的指针,信息中包含文件的名字,状态和当前读写位置。文件指针标识一个特定磁盘文件,被相连的流用来指导缓冲文件函数的操作。
文件指针是FILE型指针变量。为了读写文件,程序需要使用文件指针,为了得到一个文件指针变量,应书写的语句结构如下所示:
FILE *fp;
FILE *fopen(const char *filename,const char *mode);
函数fopen()返回一个文件指针,空文件指针标识fopen()失败。程序中绝不应该更改fopen()返回的文件指针。mode指向的串决定文件的打开方式。其取值和意义如下:
方式 | 意义 |
r | “读打开”文本文件 |
w | “写生成”文本文件 |
a | 向文本文件追加 |
rb | “读打开”二进制文件 |
wb | “写生成”二进制文件 |
ab | 向二进制文件追加 |
r+ | “读写打开”文本文件 |
w+ | “读写生成”文本文件 |
a+ | 向文本“读写”文件追加 |
r+b | “读写打开”二进制文件 |
w+b | “读写生成”二进制文件 |
a+b | 向二进制“读写”文件追加 |
下面的代码示例为输出而使用fopen()打开名为test的文件:
FILE *fp;
if((fp=fopen("test","w"))==NULL){
printf("Cannot open file.\n");
exit(1);
}
关闭文件:函数fclose()关闭fopen()打开的流。fclose()把遗留在缓冲区的数据写入文件,实施操作系统级的关闭操作。fclose()的原型:
int fclose(FILE *fp);
fp是fclose()返回的文件指针。返回零值表示关闭成功,其他值表示关闭错误。
写字符:putc()和fputc()是输出字符的2个等价函数。存在两个相同函数的简单目的是保持与C语言早期版本的兼容性。本函数向预先用fopen()“写打开”的文件写一个字符,其原型是:
int putc(int ch, FILE *fp);
fp是fopen()返回的FILE型指针。ch是被写入文件的字符。成功时返回写入的字符,否则返回EOF。
读字符:同上,读字符也是2个等价的函数getc()和fgetc()。本函数从fopen()“读打开”的文件中读一个字符,其原型是:
int getc(FILE *fp);
到达文件结尾时,getc()返回EOF。以下代码读文本文件,直到文本文件的结束:
do{
ch=getc(fp);
}while(ch!=EOF);
但上述不是判定是否到达文件尾的最佳方法。C文件系统也可以操作二进制数据,读入二进制文件时,可能遇到等于EOF值的整数,而文件尚未结束。其次getc()失败或到达文件尾均返回EOF,所以最好使用另一个函数feof()来判断。到达文件尾时,feof()返回真值,否则返回零。以下代码读入二进制数据直到文件末尾:
while(!feof(fp))
ch=getc(fp);
一个应用上述函数的综合例子:
//新建一个文本文件,从屏幕输入字符,将字符写入文件,输入“$”符号则关闭文件,终止程序
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
char ch;
//从命令行输入命令时,必须要带一个文件名的参数
if(argc!=2) {
printf("You forgot to enter the filename.\n");
exit(1);
}
//判定文件打开是否成功
if((fp=fopen(argv[1], "w"))==NULL) {
printf("Cannot open file.\n");
exit(1);
}
//从屏幕持续获取输入字符,写入文件,直到输入$符号时结束循环
do {
ch = getchar();
putc(ch, fp);
} while (ch != '$');
//关闭文件
fclose(fp);
return 0;
}
以下代码则将上述代码写入的文件逐字符读出,并显示在屏幕上。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
char ch;
if(argc!=2) {
printf("You forgot to enter the filename.\n");
exit(1);
}
if((fp=fopen(argv[1], "r"))==NULL) {
printf("Cannot open file.\n");
exit(1);
}
ch = getc(fp); /* 读出一个字符 */
//文件尚未到达文件末尾,则持续读取
while (!feof(fp)) {
putchar(ch); /* 将此字符输出到屏幕 */
ch = getc(fp);
}
fclose(fp);
return 0;
}