C语言中没有输入输出语句,所有的输入输出函数都是由ANSI C提供的一套标准库函数实现的。文件操作标准库函数有:
# 打开文件
1.函数原型
FILE *fopen(char *pname,char *mode)
二、功能说明
按照模式指定的方式打开 pname 指定的文件。 如果找不到 pname 指定的相应文件,请按以下方式之一进行:
(1)此时如果模式规定以写模式打开文件,则根据pname指定的名称新建一个文件;
(2)此时如果mode指定以读取方式打开文件,就会出错。
打开一个文件的效果是:
(1)为打开的文件赋一个FILE类型的文件结构变量,并将相关信息填入文件结构变量;
(二)开辟缓冲区;
(3)调用操作系统提供的打开文件或新建文件函数,打开或新建指定文件;
FILE *:指出fopen是一个返回文件类型的指针函数;
三、参数说明
pname:是一个字符指针,它将指向要打开或创建的文件的文件名字符串。
mode:是一个指向文件处理模式字符串的字符指针。 所有可能的文件处理方法如表 8.1 所示
4.返回值
正常返回:打开文件的文件指针。
异常返回:NULL,表示打开操作不成功。
例如:
//定义一个名叫fp文件指针 FILE *fp;
//判断按读方式打开一个名叫test的文件是否失败
if((fp=fopen("test","r")) == NULL)//打开操作不成功
{
printf("The file can not be opened.n");
exit(1);//结束程序的执行
}
需要注意的是,C语言是把计算机的输入输出设备看成文件的。 例如键盘文件、屏幕文件等。ANSI C标准规定,当程序执行时,系统自动打开键盘、屏幕和错误这三个文件。 这三个文件的文件指针分别是:标准输入stdin、标准输出stdout和标准错误stderr。
* 关闭文件
1.函数原型
int fclose(FILE *fp);
二、功能说明
关闭 fp 指向的文件。 此时调用操作系统提供的文件关闭函数关闭fp->fd指向的文件; 释放fp指向的文件类型结构变量; 返回运算结果,即0或EOF。
三、参数说明
fp:指向打开文件的文件指针。
4.返回值
正常回报:0。
异常返回:EOF,表示关闭文件时出错。
例如:
int n=fclose(fp);
* 文件读写操作
A. 从文件中读取一个字符
1.函数原型
int fgetc(FILE *fp);
二、功能说明
从 fp 指向的文件中读取一个字符。
三、参数说明
fp:这是一个文件指针,指向要从中读取字符的文件。
4.返回值
正常返回:返回读取字符的代码。
异常返回:返回EOF。 例如,试图从一个“为写入而打开”的文件中读取一个字符会导致错误并返回 EOF。
5.例子
[示例 8.1] 显示指定文件的内容。
//程序名为:display.c //执行时可用:display filename1 形式的命令行运行。显示文件filename1中的内容。例如,执行命令行display display.c将在屏幕上显示display的原代码。 //File display program. #include void main(int argc,char *argv[]) //命令行参数 {
int ch;//定义文件类型指针
FILE *fp;//判断命令行是否正确
if(argc!=2)
{
printf("Error format,Usage: display filename1n");
return; //键入了错误的命令行,结束程序的执行
}
//按读方式打开由argv[1]指出的文件
if((fp=fopen(argv[1],"r"))==NULL)
{
printf("The file can not be opened.n",argv[1]);//打开操作不成功
return;//结束程序的执行
}
//成功打开了argv[1]所指文件
ch=fgetc(fp); //从fp所指文件的当前指针位置读取一个字符
while(ch!=EOF) //判断刚读取的字符是否是文件结束符
{
putchar(ch); //若不是结束符,将它输出到屏幕上显示
ch=fgetc(fp); //继续从fp所指文件中读取下一个字符
} //完成将fp所指文件的内容输出到屏幕上显示
fclose(fp); //关闭fp所指文件 }
B. 向文件写入一个字符
1.函数原型
int fputc(int ch,FILE *fp)
二、功能说明
将ch中的字符写入fp指向的文件。
三、参数说明
ch:整型变量,内存中要写入文件的字符(C语言中整型和字符可以通用)。
fp:这是一个文件指针,指向要写入字符的文件。
4.返回值
正常返回:要写入的字符代码。
异常返回:返回EOF。 例如,当试图将字符写入“打开以供读取”的文件时,会发生错误并返回 EOF。
5.例子
[示例 8.2] 将一个文件的内容复制到另一个文件。
//程序名为:copyfile.c
//执行时可用:copyfile filename1 filename2形式的命令行运行,将文件filename1中的内容复制到文件filename2中去。
//file copy program. #include
void main(int argc,char *argv[]) //命令行参数 {
int ch;
FILE *in,*out; //定义in和out两个文件类型指针
if(argc!=3) //判断命令行是否正确
{
printf("Error in format,Usage: copyfile filename1 filename2n");
return; //命令行错,结束程序的执行
}
//按读方式打开由argv[1]指出的文件
if((in=fopen(argv[1],"r"))==NULL)
{
printf("The file can not be opened.n",argv[1]);
return; //打开失败,结束程序的执行
}
//成功打开了argv[1]所指文件,再
//按写方式打开由argv[2]指出的文件
if((out=fopen(argv[2],"w"))==NULL)
{
printf("The file %s can not be opened.n",argv[2]);
return; //打开失败,结束程序的执行
}
//成功打开了argv[2]所指文件
ch=fgetc(in); //从in所指文件的当前指针位置读取一个字符
while(ch!=EOF) //判断刚读取的字符是否是文件结束符
{
fputc(ch,out); //若不是结束符,将它写入out所指文件
ch=fgetc(in); //继续从in所指文件中读取下一个字符
} //完成将in所指文件的内容写入(复制)到out所指文件中
fclose(in); //关闭in所指文件
fclose(out); //关闭out所指文件 }
【例8.3】以小数点和字符显示文件编码,不能显示的字符用井号“#”代替。
//程序名为:dumpf.c
//执行时可用:dumpf filename1 形式的命令行运行。
// File dump program.
#include
void main(int argc,char *argv[])
{
char str[9];
int ch,count,i;
FILE *fp;
if(argc!=2)
{
printf("Error format,Usage: dumpf filenamen");
return;
}
if((fp=fopen(argv[1],"r"))==NULL)
{
printf("The file %s can not be opened.n",argv[1]);
return;
}
count=0;
do{
i=0;
//按八进制输出第一列,作为一行八个字节的首地址
printf("o: ",count*8);
do{
// 从打开的文件中读取一个字符
ch=fgetc(fp);
// 按十进制方式输出这个字符的ASCII码
printf("%4d",ch);
// 如果是不可示字符就用"#"字符代替
if(ch<' '||ch>'~') str[i]='#';
// 如果是可示字符,就将它存入数组str以便形成字符串
else str[i]=ch;
// 保证每一行输出八个字符
if(++i==8) break;
}while(ch!=EOF); // 遇到文件尾标志,结束读文件操作
str[i]=''; // 在数组str加字符串结束标志
for(;i<8;i++) printf(" "); // 一行不足八个字符用空格填充
printf(" %sn",str); // 输出字符串
count++; // 准备输出下一行
}while(ch!=EOF); // 直到文件结束
fclose(fp); // 关闭fp所指文件 }
C. 从文件中读取一个字符串
1.函数原型
char *fgets(char *str, int n, FILE *fp)
二、功能说明
从fp指向的文件中读取n-1个字符,存入str指向的字符数组中,最后加上一个字符串终止符''。
三、参数说明
str:接收字符串的内存地址,可以是数组名,也可以是指针。
n:指出要读取的字符数。
fp:这是一个文件指针,指示要从中读取字符的文件。
4.返回值
正常返回:返回字符串的首内存地址,即str的值。
异常返回:返回NULL值。 这时候就应该使用feof()或者ferror()函数来判断是否读到文件末尾或者出错了。比如要从一个“write open”的文件中读取一个字符串,把
发生错误并返回 NULL 值。
D. 将字符串写入文件
1.函数原型
int fputs(char *str,FILE *fp)
二、功能说明
将str指向的字符串写入fp指向的文件。
三、参数说明
str:指出要写入文件的字符串。
fp:这是一个文件指针,表示要写入字符串的文件。
4.返回值
正常返回:写入文件的字符数,即字符串的长度。
异常返回:返回一个NULL值,此时应该使用feof()或ferror()函数判断是否读取
已到达文件末尾,但发生错误。 例如,要将字符串写入“读取打开”文件,
发生错误并返回 NULL 值。
5.例子
[示例 8.4] 以下程序将一个文件的内容附加到另一个文件。
//程序名:linkfile.c
//执行时可用:linkfile filename1 filename2形式的命令行运行,将文件filename2的内容附加在文件filename1之后。
// file linked program.
#include
#define SIZE 512
void main(int argc,char *argv[]) {
char buffer[SIZE];
FILE *fp1,*fp2;
if(argc!=3)
{
printf("Usage: linkfile filename1 filename2n");
return;
}
// 按追加方式打开argv[1] 所指文件
if((fp1=fopen(argv[1],"a"))==NULL)
{
printf("The file %s can not be opened.n",argv[1]);
return;
}
if((fp2=fopen(argv[2],"r"))==NULL)
{
printf("The file %s can not be opened.n",argv[2]);
return;
}
// 读入一行立即写出,直到文件结束
while(fgets(buffer,SIZE,fp1)!=NULL)
printf("%sn",buffer);
while(fgets(buffer,SIZE,fp2)!=NULL)
fputs(buffer,fp1);
fclose(fp1);
fclose(fp2);
if((fp1=fopen(argv[1],"r"))==NULL)
{
printf("The file %s can not be opened.n",argv[1]);
return;
}
while(fgets(buffer,SIZE,fp1)!=NULL)
printf("%sn",buffer);
fclose(fp1);
}
E. 向文件写入格式化数据
1.函数原型
int fprintf(FILE *fp,char *format,arg_list)
二、功能说明
将变量表列(arg_list)中的数据按照format指示的格式写入fp指定的文件中。 fprintf() 函数与 printf() 函数具有相同的功能,只是 printf() 函数将数据写入屏幕文件(stdout)。
三、参数说明
fp:这是一个文件指针,表示写入数据的文件。
format:这是一个字符指针,指向一个字符串,里面包含了要写入的数据的格式,所以这个字符串就变成了格式化字符串。 格式字符串描述的规则与 printf() 函数中的格式字符串相同。
arg_list:是要写入文件的变量列表,变量之间用逗号隔开。
4.返回值
没有任何。
5.例子
【8.5】以下程序的执行文件为display.exe,执行时输入命令行:
显示 [-i][-s] 文件名
下表列出了命令行参数的含义及其作用:
//存储文件名:save.txt
//程序代码如下:
// file display program.
#include
void main() {
char name[10];
int nAge,nClass;
long number;
FILE *fp;
if((fp=fopen("student.txt","w"))==NULL)
{
printf("The file %s can not be opened.n","student.txt");
return;
}
fscanf(stdin,"%s %d %d %ld",name,&nClass,&nAge,&number);
fprintf(fp,"%s %5d %4d %8ld",name,nClass,nAge,number);
fclose(fp);
if((fp=fopen("student.txt","r"))==NULL)
{
printf("The file %s can not be opened.n","student.txt");
return;
}
fscanf(fp,"%s %d %d %ld",name,&nClass,&nAge,&number);
printf("name nClass nAge numbern");
fprintf(stdout,"%-10s%-8d%-6d%-8ldn",name,nClass,nAge,number);
fclose(fp);
}
G.以二进制形式读取文件中的数据
1.函数原型
int fread(void *buffer,unsigned sife,unsigned count,FILE *fp)
二、功能说明
从fp指定的文件中,以二进制形式读取sife*count数据到buffer指向的数据区。
三、参数说明
buffer:这是一个void指针,指向要存放读取数据的存储区的首地址。
sife:数据块的字节数,即数据块的大小。
count:指出一次读入多少个数据块(sife)。
fp:这是一个文件指针,指出要从中读取数据的文件。
4.返回值
正常返回:实际读取数据块的个数,即count。
异常返回:如果文件中剩余数据块的个数小于参数中count所指示的个数,或者发生错误,则返回0。此时可以通过feof()和ferror()来判断是什么发生了
健康)状况。
H. 以二进制形式将数据写入文件
1.函数原型
int fwrite(void *buffer,unsigned sife,unsigned count,FILE *fp)
二、功能说明
以二进制形式,将buffer指定的数据缓冲区中的sife*count数据写入fp指定的文件中。
三、参数说明
buffer:这是一个void指针,指向要输出到文件的缓冲区的首地址。
sife:数据块的字节数,即数据块的大小。
count:一次输出多少个数据块(sife)。
fp:这是一个文件指针,指出要从中读取数据的文件。
4.返回值
正常返回:实际输出数据块的个数c读取txt文件每一行,即count。
异常返回:返回0值c读取txt文件每一行,表示输出结束或发生错误。
5.例子
【例8.7】
#include
#define SIZE 4 struct worker
{ int number;
char name[20];
int age;
};
void main() {
struct worker wk;
int n;
FILE *in,*out;
if((in=fopen("file1.txt","rb"))==NULL)
{
printf("The file %s can not be opened.n","file1.txt");
return;
}
if((out=fopen("file2.txt","wb"))==NULL)
{
printf("The file %s can not be opened.n","file2.txt");
return;
}
while(fread(&wk,sizeof(struct worker),1,in)==1)
fwrite(&wk,sizeof(struct worker),1,out);
fclose(in);
fclose(out);
}
一、读取二进制形式的整数
1.函数原型
int putw(int n,FILE *fp)
二、功能说明
从 fp 指定的文件中读取二进制形式的整数。
三、参数说明
fp:是文件指针。
4.返回值
正常返回:读取的整数值。
异常返回:返回EOF,即-1。 由于读取到的整数值可能为-1,所以必须使用feof()或ferror()来判断是文件末尾还是发生了错误。
5.例子
【例8.8】
#include
void main(int argc,char *argv[]) {
int i,sum=0;
FILE *fp;
if(argc!=2)
{
printf("Command error,Usage: readfile filenamen");
exit(1);
}
if(!(fp=fopen(argv[1],"rb")))
{
printf("The file %s can not be opened.n",argv[1]);
exit(1);
}
for(i=1;i<=10;i++) sum+=getw(fp);
printf("The sum is %dn",sum);
fclose(fp);
}
J. 以二进制形式存储一个整数
1.函数原型
int feof(FILE *fp)
二、功能说明
将变量 n 指向的整数值以二进制形式存储到 fp 指定的文件中。
三、参数说明
n:要存储在文件中的整数。
fp:是文件指针。
4.返回值
正常返回:输出的整数值。
异常返回:返回EOF,即-1。 由于输出的整数值可能是-1,所以必须使用feof()或ferror()来判断是文件结束还是出错。
5.例子
【例8.9】
* 文件状态检查
A. 文件结尾
(1) 函数原型
int feof(FILE *fp)
(2) 功能说明
该函数用于判断文件是否结束。
(3) 参数说明
fp:文件指针。
(4)返回值
0:假值,表示文件没有结束。
1:真值,表示文件结束。
(5) 例子
【例8.10】
#include
void main(int argc,char *argv[]) {
FILE *in,*out;
char ch;
if(argc!=3)
{
printf("Usage: copyfile filename1 filename2n");
return;
}
if((in=fopen(argv[1],"rb"))==NULL)
{
printf("The file %s can not be opened.n",argv[1]);
return;
}
if((out=fopen(argv[2],"wb"))==NULL)
{
printf("The file %s can not be opened.n",argv[2]);
return;
}
while(!feof(in))
{
ch=fgetc(in);
if(ferror(in))
{
printf("read error!n");
clearerr(in);
}
else
{
fputc(ch,out);
if(ferror(out))
{
printf("write error!n");
clearerr(out);
}
}
}
fclose(in);
fclose(out);
}
B.文件读写错误
(1) 函数原型
int ferror(FILE *fp)
(2) 功能说明
检查 fp 指定文件的读写错误。
(3) 参数说明
fp:文件指针。
(4)返回值
0:假值,表示没有错误。
1:真值,表示错误。
C.清除文件错误标志
(1) 函数原型
void clearerr(FILE *fp)
(2) 功能说明
清除 fp 指定文件的错误标志。
(3) 参数说明
fp:文件指针。
(4)返回值
没有任何。
(5) 例子
【例8.12】
#include
void main(int argc,char *argv[]) {
FILE *in,*out;
char ch;
if(argc!=3)
{
printf("Usage: copyfile filename1 filename2n");
return;
}
if((in=fopen(argv[1],"rb"))==NULL)
{
printf("The file %s can not be opened.n",argv[1]);
return;
}
if((out=fopen(argv[2],"wb"))==NULL)
{
printf("The file %s can not be opened.n",argv[2]);
return;
}
while(!feof(in))
{
ch=fgetc(in);
if(ferror(in))
{
printf("read error!n");
clearerr(in);
}
else
{
fputc(ch,out);
if(ferror(out))
{
printf("write error!n");
clearerr(out);
}
}
}
fclose(in);
fclose(out);
}