C 语⾔——从⽂本⽂件中读⼊及向⽂本⽂件中写⼊内容
⽬录
1. 打开与关闭⽂件
头⽂件:<stdio.h>
⽤fopen 函数打开数据⽂件
所谓“打开”是指为⽂件建⽴相应的信息区和⽂件缓冲区。
ANSI C规定了⽤标准输⼊输出函数fopen来实现打开⽂件: ⽤法:fopen(⽂件名,使⽤⽂件⽅式),如
fopen函数的返回值是指向a1⽂件的指针变量(即a1⽂件信息区的起始地址)。通常将fopen函数的返回值赋给⼀个指向⽂件的指针变量。如这样fp就和⽂件a1相联系了,或者说fp指向了⽂件。使⽤⽂件的⽅式:r: 只读⽅式,⽂件必须存在w: 只写⽅式,若⽂件存在,则原有内容会被清除;若⽂件不存在,则会建⽴⽂件a: 追加⽅式打开只写⽂件,只允许进⾏写操作,若⽂件存在,则添加的内容放在⽂件末尾;若不存在,则建⽴⽂件+: 可读可写b: 以⼆进制⽅式打开⽂件
t: 以⽂本⽅式打开⽂件(默认⽅式下以⽂本⽅式打开⽂件)常见的组合:r: 以只读的⽅式打开⽂件,只允许读,此⽂件必须存在,否则返回NULL,打开成功后返回⽂件指针,位置指针指向⽂件头部r+: 以可读可写的⽅式打开⽂件,允许读写,此⽂件必须存在,否则返回NULL,打开成功后返回⽂件指针,位置指针指向⽂件头部rb+: 以可读可写、⼆进制⽅式打开⽂件,允许读写,此⽂件必须存在,否则返回NULL,打开成功后返回⽂件指针,位置指针指向⽂件头部
rt+: 以可读可写、⽂本⽅式打开⽂件,允许读写,此⽂件必须存在,否则返回NULL,打开成功后返回⽂件指针,位置指针指向⽂件头部
w: 以只写的⽅式打开⽂件,只允许写,若⽂件存在,⽂件中原有内容会被清除;若⽂件不存在,则创建⽂件,打开成功后返回⽂件指针,位置指针指向⽂件头部
w+: 以读写的⽅式打开⽂件,允许读写,若⽂件存在,⽂件中原有内容会被清除;若⽂件不存在,则创建⽂件,打开成功后返回⽂件指针,位置指针指向⽂件头部
a: 以追加、只写的⽅式打开⽂件,只允许写。若⽂件存在,则追加的内容添加在⽂件末尾,若⽂件不存在,则创建⽂件。打开成功后返回⽂件指针,位置指针指向⽂件头部(注意很多书上或资料上讲述追加⽅式打开成功后位置指针指向⽂件末尾是错误的)
a+: 以追加、可读写的⽅式打开⽂件,允许读写。若进⾏读操作,则从头开始读;若进⾏写操作,则将内容添加在末尾。若⽂件不存在,则创建⽂件。打开成功后返回⽂件指针,位置指针指向⽂件头部。fopen ("a1","r");
1FILE *fp ;fp =fopen ("a1","r");
1
2
常⽤⽂件打开⽅式:
⽤fclose 函数关闭数据⽂件
⽤法:fclose(⽂件指针),如
关闭⽂件的⽬的是防⽌结束程序时数据丢失。因为向⽂件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给⽂件,当数据未充满缓冲区时程序结束运⾏,有可能使缓冲区的数据丢失。 ⽤fclose函数关闭⽂件时,会先把缓冲区中的数据输出到磁盘⽂件,然后才撤销⽂件信息区。 fclose函数也带回⼀个值,当成功的执⾏了关闭操作,则返回为0,否则返回EOF(-1)。
2. 对⽂件进⾏读写
printf和scanf函数向终端进⾏格式化的输⼊输出。
fprintf和fscanf函数向⽂件进⾏格式化的输⼊输出。
⽤fscanf 从⽂件进⾏读⼊数据
⽤法:fscanf(⽂件指针,格式化字符串,出⼊表列),如:
fgets和fgetc的区别⽤fprintf 将数据写⼊⽂件
⽤法:fprintf(⽂件指针,格式化字符串,输出表列),如:
3. 读写字符
⽤fgetc 从⽂件读出字符
⽤法:fgetc(fp),从fp指向的⽂件读⼊⼀个字符,读成功带回所读字符,失败则返回⽂件结束标志EOF
⽤fputc 将字符写⼊⽂件
⽤法:fputc(ch,fp),把字符ch写到⽂件指针变量fp所指向的⽂件中,输出成功返回值就是输出的字符,输出失败则返回EOF。
在访问磁盘⽂件时,是逐个字符(字节)进⾏的,每访问完⼀个字节后,当前读写位置⾃动后移。为了知道对⽂件读写是否完成,即检测⽂件尾标志是否已被读取过(⽂件的所有有效字符后有⼀个⽂件尾标志,⽤标识符EOF表⽰)。⽤feof函数可检测⽂件尾标志是否被读取过,若已读过,返回值为1,否则为0。
4. 读写字符串
⽤fgets 从⽂件读出字符串
⽤法:fgets(str,n,fp);
即从fp指向的⽂件读⼊⼀个长度为(n-1)的字符串(最后加⼀个’\0’),存放到字符数组str中,返回值为地址str或NULL。
如果读完字符串之前遇到’\n’或EOF,读⼊结束,’\n’也作为⼀个字符读⼊。
⽤fputs 将字符串写⼊⽂件if ((fp =fopen ("file1","r"))==NULL ){ printf ("cannot open this file\n"); exit (0);}1
2
3
4fclose (fp );
1fscanf (fp ,"%d,%f",&i ,&f );
1fprintf (fp ,"%d,%6.2f",i ,f )
1
⽤法:fputs(str,fp);
即把str所指向的字符串写到⽂件指针变量fp所指向的⽂件中。
输出成功,返回0,否则返回⾮0值
5. ⽤⼆进制⽅式向⽂件读写⼀组数据
⽤fread 从⽂件中读出⼀组数据
⽤法:fread(buffer,size,count,fp);
从⽂件读⼊count个size⼤⼩的数据项,放在地址buffer中。
⽤fwrite 将⼀组数据写⼊⽂件
⽤法:fwrite(buffer,size,count,fp);
把从地址buffer开始的存储区中的数据向⽂件输出。
在读写时以⼆进制形式进⾏的,向磁盘写数据时,直接将内存中⼀组数据原封不动、不加转换的复制到磁盘⽂件上。fread或fwrite函数的类型为int型,如果执⾏成功,则返回值为形参count的值,即输⼊或输出数据项的个数。
6. 关于⽂件位置标记的函数
rewind 函数
rewind函数使⽂件位置标记指向⽂件开头,⽆返回值。
⽤法:rewind(⽂件指针类型),如:
fseek 函数
⽤法:fseek(⽂件类型指针,位移量,起始点),如
7. 例程rewind (fp )
1fseek (fp ,100L ,0);//将⽂件位置标记向前移到离开头100个字节处fseek (fp ,50L ,1); //将⽂件位置标记向前移到离当前位置50个字节处fseek (fp ,-10L ,2); //将⽂件位置标记从末尾处向后退10个字节
1
2
3
<⽂件的原内容:
程序运⾏后,的内容为:#include <stdio.h>#include <stdlib.h>void main (){ //打开⽂件 FILE *fp ; fp =fopen ("","a+"); //data ⽂件的位置请注意 if (fp ==NULL ) { printf ("error\n"); exit (0); //exit 在头⽂件stdlib.h 中 } //从data ⽂件读⼊数据 int year =0,lon =0,lat =0; double pre =0;//年份 经度 纬度 降⾬量 fscanf (fp ,"%d %d %d %lf",&year ,&lon ,&lat ,&pre ); year ++; //向data ⽂件写⼊数据 fprintf (fp ,"\n%d %d %d %.2lf",year ,lon ,lat ,pre ); //从data ⽂件读⼊字符 rewind (fp ); char c ; c =fgetc (fp ); //向data ⽂件写⼊字符,需要先rewind ⼀下 rewind (fp ); fprintf (fp ,"\n"); if (fputc (c ,fp )==EOF ){ printf ("\nerror"); exit (0); } //从data ⽂件读⼊字符串 fseek (fp ,3L ,0); //将⽂件位置标记向前移到离开头3个字节处 char A [8]; fgets (A ,8,fp ); //获得长度为7(即8-1)的字符串 //向data ⽂件输出字符串 rewind (fp ); fprintf (fp ,"\n"); fputs (A ,fp ); //关闭⽂件 fclose (fp );}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论