文件的读写操作
A. 从文件中读取一个字符
1. 函数原型
int fgetc(FILE *fp);
2. 功能说明
从fp所指文件中读取一个字符。
3. 参数说明
fp:这是个文件指针,它指出要从中读取字符的文件。
4. 返回值
正常返回: 返回读取字符的代码。
非正常返回:返回EOF。例如,要从"写打开"文件中读取一个字符时,会发生错误而返回一个EOF。
5. 实例
【例8.1】显示指定文件的内容。
程序名为:display.c
执行时可用:display filename1 形式的命令行运行。显示文件filename1中的内容。例如,执行命令行display display.c将在屏幕上显示display的原代码。
/* File display program. */
#include
main(int argc,char *argv[]) /* 命令行参数 */
{ int ch;
/* 定义文件类型指针 */
FILE *fp;
/* 判断命令行是否正确 */
if(argc!=2)
{ printf("Error format,Usage: display filename1\n");
exit(1); /* 键入了错误的命令行,结束程序的执行 */
}
/* 按读方式打开由argv[1]指出的文件 */
if((fp=fopen(argv[1],"r"))==NULL){
/* 打开操作不成功 */
printf("The file <%s> can not be opened.\n",argv[1]);
/* 结束程序的执行 */
exit(1);
}
/* 成功打开了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)
2. 功能说明
把ch中的字符写入由fp指出的文件中去。
3. 参数说明
ch:是一个整型变量,内存要写到文件中的字符(C语言中整型量和字符量可以通用)。
fp:这是个文件指针,指出要在其中写入字符的文件。
4. 返回值
正常返回: 要写入字符的代码。
非正常返回:返回EOF。例如,要往"读打开"文件中写一个字符时,会发生错误而返回一个EOF。
5. 实例
【例8.2】将一个文件的内容复制到另一个文件中去。
程序名为:copyfile.c
执行时可用:copyfile filename1 filename2形式的命令行运行,将文件filename1中的内容复制到文件filename2中去。
/* file copy program. */
#include
main(int argc,char *argv[]) /* 命令行参数 */
{ int ch;
FILE *in,*out; /* 定义in和out两个文件类型指针 */
if(argc!=3) /* 判断命令行是否正确 */
{ printf("Error in format,Usage: copyfile filename1
filename2\n");
exit(1); /* 命令行错,结束程序的执行 */
}
/* 按读方式打开由argv[1]指出的文件 */
if((in=fopen(argv[1],"r"))==NULL)
{ printf("The file <%s> can not be opened.\n",argv[1]);
exit(1); /* 打开失败,结束程序的执行 */
}
/* 成功打开了argv[1]所指文件,再 */
/* 按写方式打开由argv[2]指出的文件 */
if((out=fopen(argv[2],"w"))==NULL)
{ printf("The file %s can not be opened.\n",argv[2]);
exit(1); /* 打开失败,结束程序的执行 */
}
/* 成功打开了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
main(int argc,char *argv[])
{ char str[9];
int ch,count,i;
FILE *fp;
if(argc!=2)
{ printf("Error format,Usage: dumpf filename\n");
exit(1);
}
if((fp=fopen(argv[1],"r"))==NULL)
{ printf("The file %s can not be opened.\n",argv[1]);
exit(0);
}
count=0;
do{ i=0;
/*按八进制输出第一列,作为一行八个字节的首地址*/
printf("%06o: ",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]='\0'; /* 在数组str加字符串结束标志 */
for(;i<8;i++) printf(" "); /* 一行不足八个字符用空格填充 */
printf(" %s\n",str); /* 输出字符串 */
count++; /* 准备输出下一行 */
}while(ch!=EOF); /* 直到文件结束 */
fclose(fp); /* 关闭fp所指文件 */
}
C. 从文件中读取一个字符串
1. 函数原型
char *fgets(char *str,int n,FILE *fp)
2. 功能说明
从由fp指出的文件中读取n-1个字符,并把它们存放到由str指出的字符数组中去,最后加上一个字符串结束符'\0'。
3. 参数说明
str:接收字符串的内存地址,可以是数组名,也可以是指针。
n: 指出要读取字符的个数。
fp:这是个文件指针,指出要从中读取字符的文件。
4. 返回值
正常返回:返回字符串的内存首地址,即str的值。
非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要从"写打开"文件中读取字符串,将
发生错误而返回一个NULL值。
D. 写一个字符串到文件中去
1. 函数原型
int fputs(char *str,FILE *fp)
2. 功能说明
把由str指出的字符串写入到fp所指的文件中去。
3. 参数说明
str:指出要写到文件中去的字符串。
fp:这是个文件指针,指出字符串要写入其中的文件。
4. 返回值
正常返回: 写入文件的字符个数,即字符串的长度。
非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要往一个"读打开"文件中写字符串时,
会发生错误而返回一个NULL值。
5.实例
【例8.4】以下程序将一个文件的内容附加到另一个文件中去。
设下面这个程序名为:linkfile.c
执行时可用:linkfile filename1 filename2形式的命令行运行,将文件filename2的内容附加在文件filename1之后。
/* file linked program. */
#include
#define SIZE 512
main(int argc,char *argv[])
{ char buffer[SIZE];
FILE *fp1,*fp2;
if(argc!=3)
{ printf("Usage: linkfile filename1 filename2\n");
exit(1);
}
/* 按追加方式打开argv[1] 所指文件 */
if((fp1=fopen(argv[1],"a"))==NULL)
{ printf("The file %s can not be opened.\n",argv[1]);
exit(1);
}
if((fp2=fopen(argv[2],"r"))==NULL)
{ printf("The file %s can not be opened.\n",argv[2]);
exit(1);
}
/* 读入一行立即写出,直到文件结束 */
while(fgets(buffer,SIZE,fp1)!=NULL)
printf("%s\n",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]);
exit(1);
}
while(fgets(buffer,SIZE,fp1)!=NULL)
printf("%s\n",buffer);
fclose(fp1);
}
E. 往文件中写格式化数据
1.函数原型
int fprintf(FILE *fp,char *format,arg_list)
2.功能说明
将变量表列(arg_list)中的数据,按照format指出的格式,写入由fp指定的文件。fprintf()函数与printf()函数的功能相同,只是printf()函数是将数据写入屏幕文件(stdout)。
3.参数说明
fp:这是个文件指针,指出要将数据写入的文件。
format:这是个指向字符串的字符指针,字符串中含有要写出数据的格式,所以该字符串成为格式串。格式串描述的规则与printf()函数中的格式串相同。
arg_list:是要写入文件的变量表列,各变量之间用逗号分隔。
4.返回值
无。
5. 实例
【8.5】下列程序的执行文件为display.exe,执行时键入命令行:
display [-i][-s] filename
下面的表格列出了命令行参数的含义及其功能: