c中文件的读取操作
“文件(file)”:所谓“文件”是指一组相关数据的有序集合。数据以文件的形式存放在外部介质(一般是磁盘、磁带、光盘等)上,操作系统中是以文件为单位对数据进行管理的,以文件名作为访问文件的标识。
C语言把文件看作一个字节序列,即由一连串的字节组成。根据文件中的数据组织形式,数据文件可分为ASCII码文件和二进制文件。ASCII码文件,又称为“文本文件”(text),其每一个字节存放一个ASCII码。二进制文件,把内存中的数据按其在内存中的存储形式存放在磁盘上。
如:十进制整数10000,在内存中占两个字节,其存放形式是:00100111,00010000。在二进制文件中也按这种方式存放。但是,在ASCII文件中,十进制整数10000存放为31H、30H、30H、30H、30H,占五个字节,它们分别是1、0、0、0、0、0字母的ASCII码。
c中文件的读取,只有通过文件指针,才能调用相应的文件。文件操作的过程:对磁盘文件的操作必须“先打开,后读取,最后关闭”。
下面就是利用文件指针,打开一个文件,以只读的打开方式。- <span style="white-space:pre"> </span>FILE * fp;
- fp = fopen("D://1//123.txt","r");
<span style="white-space:pre"> </span>FILE * fp;
fp = fopen("D://1//123.txt","r");
下面分析下fopen函数中的第二个参数使用文件方式的类别,
使用文件方式 | 含义 |
"r"(只读) | 为输入打开一个文本文件 |
"w"(只写) | 为输出打开一个文本文件 |
"a"(追加) | 为追加打开一个文本文件 |
"rb"(只读) | 为输入打开一个二进制文件 |
"wb"(只写) | 为输出打开一个二进制文件 |
"ab"(追加) | 为追加打开一个二进制文件 |
"r+"(读写) | 为读/写打开一个文本文件 |
"w+"(读写) | 为读/写创建一个文本文件 |
"a+"(读写) | 为读/写打开一个文本文件 |
"rb+"(读写) | 为读/写打开一个二进制文件 |
"wb+"(读写) | 为读/写创建一个二进制文件 |
"ab+"(读写) | 为读/写打开一个二进制文件 |
注释:
1、若使用文件方式为“a”,表示向文件尾添加新数据(不删除原有数据),但要求此时文件必须存在,否则出错,但是我在是vs2010中调试,文件不存在,会自动建立一个文件,不会报错,此外只能向文件写数据不能读取文件中的数据。若使用文件方式为“a+”,表示向文件尾添加新数据(不删除原有数据),文件不存在,会自动建立一个文件,不会报错,另外使用这种文件方式,打开的文件即可以用来输入数据,也可以用来输出数据。
2、用"w"方式打开的文件只能用于向该文件写数据。如果原来不存在该文件,则在打开时新建一个文件,如果该文件存在,则先删除该文件(其中的数据肯定删除了),然后重新建立一个新文件。
3、若使用文件方式为“w+”和“w”,如果原来不存在该文件,则在打开时新建一个文件,如果该文件存在,则先删除该文件(其中的数据肯定删除了),然后重新建立一个新文件。
4、若使用文件方式为“r+",该文件必须存在,向文件中写入数据的时候,不会先删除该文件,而是直接覆盖,能覆盖多少就覆盖多少,覆盖不了的先前数据仍然存在文件中。
使用文件方式为“r+”,向文件中存入数据:
- int main(void)
- {
- FILE * fp;
- if((fp = fopen("D://1//123.txt","r+"))== NULL)
- {
- printf("can not open the file\n");
- exit(0);
- }
- char str[] ="he fei wo yao liu xia1";
- int len = strlen(str);
- for(int i = 0; i < len;i++)
- {
- fputc(str[i],fp);
- }
- fclose(fp);
- return 0;
- }
int main(void)
{
FILE * fp;
if((fp = fopen("D://1//123.txt","r+"))== NULL)
{
printf("can not open the file\n");
exit(0);
}
char str[] ="he fei wo yao liu xia1";
int len = strlen(str);
for(int i = 0; i < len;i++)
{
fputc(str[i],fp);
}
fclose(fp);
return 0;
}
使用文件方式为“r+”,从文件中读出数据
- int main(void)
- {
- FILE * fp;
- if((fp = fopen("D://1//123.txt","r+"))== NULL)
- {
- printf("can not open the file\n");
- exit(0);
- }
- char ch = fgetc(fp);
- while(ch != EOF)//从文本文件中读取数据
- {
- putchar(ch);
- ch = fgetc(fp);
- }
- fclose(fp);
- return 0;
- }
int main(void)
{
FILE * fp;
if((fp = fopen("D://1//123.txt","r+"))== NULL)
{
printf("can not open the file\n");
exit(0);
}
char ch = fgetc(fp);
while(ch != EOF)//从文本文件中读取数据
{
putchar(ch);
ch = fgetc(fp);
}
fclose(fp);
return 0;
}
对于文本文件,遇文件尾时返回文件结束标志EOF。对于二进制文件,用feof(fp) 判别是否遇文件尾,feof(fp)=1说明遇文件尾。
从文本文件中顺序读入文件内容,并在屏幕上显示出来,可以用:
- ch = fgetc(fp);
- while(ch != EOF)
- {
- putchar(ch);
- ch = fgetc(fp);
- }
ch = fgetc(fp);
while(ch != EOF)
{
putchar(ch);
ch = fgetc(fp);
}
从二进制文件中顺序读入文件内容,可以用:
- while(!feof(fp))
- {
- ch = fgetc(fp);
- }
while(!feof(fp))
{
ch = fgetc(fp);
}
如果在文件中写入数据,如果没有关闭就直接读取文件中的内容,就会出现错误-写好文件后,没有关闭,那么文件指针在最后一个位置,那你在读的时候肯定就是从末尾啊,所以是随机字符,这样会出现乱码。如何纠正,等文件写完数据后,首先关闭文件,再读取文件,即可,如下
fclose(fp);
fp = fopen("D://1//123.txt","r+");
下面介绍读写字符串函数:fgets和fputs:
fp = fopen("D://1//123.txt","r+");
下面介绍读写字符串函数:fgets和fputs:
1、读字符串函数fgets函数
功能:从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针);其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。
注意:
a、在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束,但遇到空格不结束。
b、fgets函数也有返回值,其返回值是字符数组的首地址。
- int main(void)
- {
- FILE *fp;
- char str[12];
- if((fp=fopen("D://1//123.txt","rt"))==NULL)
- {
- printf("Cannot open file !");
- exit(0);
- }
- fgets(str,12,fp);
- printf("%s",str);
- fclose(fp);
- return 0;
- }
int main(void)
{
FILE *fp;
char str[12];
if((fp=fopen("D://1//123.txt","rt"))==NULL)
{
printf("Cannot open file !");
exit(0);
}
fgets(str,12,fp);
printf("%s",str);
fclose(fp);
return 0;
}
2、写字符串函数fputs函数
功能:向指定的文件写入一个字符串,其调用形式为: fputs(字符串,文件指针) 其中字符串可以是字符串常量,也可以是字符数组名或指针 变量,例如:fputs(“abcd“,fp);
- int main(void)
- {
- FILE *fp;
- char ch,st[20];
- if((fp=fopen("D://1//123.txt","a+"))==NULL)
- {
- printf("Cannot open file !");
- exit(0);
- }
- printf("input a string:\n");
- scanf("%s",st);
- fputs(st,fp);
- rewind(fp);//把文件流的指针指向开头的位置
- ch=fgetc(fp);
- while(ch!=EOF)
- {
- putchar(ch);
- ch=fgetc(fp);
- }
- fclose(fp);
- return 0;
- }
int main(void)
{
FILE *fp;
char ch,st[20];
if((fp=fopen("D://1//123.txt","a+"))==NULL)
{
printf("Cannot open file !");
exit(0);
}
printf("input a string:\n");
scanf("%s",st);
fputs(st,fp);
rewind(fp);//把文件流的指针指向开头的位置
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
return 0;
}
下面介绍文件中的格式化函数fscanf和fprintf
1、fscanf
a、函数原型:
- int fscanf(FILE *fp,char *format,arg_list)
int fscanf(FILE *fp,char *format,arg_list)
b、功能说明将fp指定的文件中的数据按照format指定的格式,输出到变量表列(arg_list)中的相应变量。fscanf遇到空格和换行符就结束。表示遇到空格或者换行符,文件中的相应数据读取结束。
c、注意
文件中的数据以逗号隔开,对应的format中的指定格式也以逗号隔开。此时我在vs2010中运行出现错误。
d、返回值
成功返回读入的参数的个数,失败返回EOF(-1)。
- void main()
- {
- FILE* fp ;
- if((fp = fopen("D://1.txt","r+"))==NULL)
- {
- printf("can not open the file");
- exit(1);
- }
- int a;
- double b;
- char c[15];
- fscanf(fp,"%d%lf%s",&a,&b,c);
- printf("%d ",a);
- printf("%lf ",b);
- printf("%s ",c);
- }
void main()
{
FILE* fp ;
if((fp = fopen("D://1.txt","r+"))==NULL)
{
printf("can not open the file");
exit(1);
}
int a;
double b;
char c[15];
fscanf(fp,"%d%lf%s",&a,&b,c);
printf("%d ",a);
printf("%lf ",b);
printf("%s ",c);
}
2、fprintf
a、函数原型:
- int fprintf(FILE *fp,char *format,arg_list)
int fprintf(FILE *fp,char *format,arg_list)
b、功能说明
将变量表列(arg_list)中的数据,按照format指出的格式,写入由fp指定的文件。fprintf()函数与printf()函数的功能相同,只是printf()函数是将数据写入屏幕文件(stdout)。 fprintf函数按格式将内存中的数据转换成对应的字符,并以ASCⅡ代码形式输出到文本文件中。
c、参数说明
fp:这是个文件指针,指出要将数据写入的文件。
format:这是个指向字符串的字符指针,字符串中含有要写出数据的格式,所以该字符串成为格式串。格式串描述的规则与printf()函数中的格式串相同。
arg_list:是要写入文件的变量表列,各变量之间用逗号分隔。
将变量表列(arg_list)中的数据,按照format指出的格式,写入由fp指定的文件。fprintf()函数与printf()函数的功能相同,只是printf()函数是将数据写入屏幕文件(stdout)。 fprintf函数按格式将内存中的数据转换成对应的字符,并以ASCⅡ代码形式输出到文本文件中。
c、参数说明
fp:这是个文件指针,指出要将数据写入的文件。
format:这是个指向字符串的字符指针,字符串中含有要写出数据的格式,所以该字符串成为格式串。格式串描述的规则与printf()函数中的格式串相同。
arg_list:是要写入文件的变量表列,各变量之间用逗号分隔。
d、返回值
输出的字符数,发生错误时返回一个负值。
- void main()
- {
- FILE* fp ;
- if((fp = fopen("D://1.txt","wb+"))==NULL)
- {
- printf("can not open the file");
- exit(1);
- }
- int a = 100;
- double b = 6.5;
- char c[15] ="tansheng";
- fprintf(fp,"%d %lf %s",a,b,c);
- }
void main()
{
FILE* fp ;
if((fp = fopen("D://1.txt","wb+"))==NULL)
{
printf("can not open the file");
exit(1);
}
int a = 100;
double b = 6.5;
char c[15] ="tansheng";
fprintf(fp,"%d %lf %s",a,b,c);
}
fprintf格式串中之间有空格或者有逗号,则对应在文件中也有相应的空格或逗号。
fprintf和fscanf函数对磁盘文件读写,使用方便,但由于在输入时要将ASCII码转换为二进制
形式,
在输出时又要将二进制形式转换为字符,花费时间比较多。因此,在内存与磁盘频繁
交换数据的
情况下,最好不用fprinf和fscanf函数,而用fread和fwrite。