第10章 对文件的输入输出(五)
、字符数组名或字符型指针。字符串末尾的′\0′不输出。若输出成功,函数值为0;失败时,函数值为EOF(即-1)。 |
说明:
fgets和fgets这两个函数的功能类似于gets和puts函数,只是gets和puts以终端为读写对象,而fgets和fputs函数以指定的文件作为读写对象。 |
[例] 从键盘读入若干个字符串,对它们按字母大小顺序排序,然后把排好序的字符串送到磁盘文件中保存
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE*fp; char str[3][10],temp[10]; //str是用来存放字符串的二维数组,temp是临时数组 int i,j,k,n=3; printf("Enter strings:\n"); //提示输入字符串 for(i=0;i<n;i++) gets(str[i]); //输入字符串 for(i=0;i<n-1;i++) //用选择法对字符串排序 { k=i; for(j=i+1;j<n;j++) if(strcmp(str[k],str[j])>0) k=j; if(k!=i) { strcpy(temp,str[i]); strcpy(str[i],str[k]); strcpy(str[k],temp);} } if((fp=fopen("D:\\CC\\string.dat","w"))==NULL) //打开磁盘文件 //′\′为转义字符的标志,因此在字符串中要表示′\′用′\\′ { printf("can′t open file!\n"); exit(0); } printf("\nThe new sequence:\n"); for(i=0;i<n;i++) { fputs(str[i],fp);fputs("\n",fp); //向磁盘文件写一个字符串,然后输出一个换行符 printf("%s\n",str[i]); //在屏幕上显示 } return 0; } |
运行结果:
[例] 从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符串送到磁盘文件中保存。(可以编写出以下的程序,从文件string.dat中读回字符串,并在屏幕上显示)
#include <stdio.h> #include <stdlib.h> int main() { FILE*fp; char str[3][10]; int i=0; if((fp=fopen("D:\\CC\\string.dat","r"))==NULL) //注意文件路径必须与前相同 { printf("can′t open file!\n"); exit(0); } while(fgets(str[i],10,fp)!=NULL) { printf("%s",str[i]); i++; } fclose(fp); return 0; } |
运行结果:
10.3.3 用格式化的方式读写文本文件
可以对文件进行格式化输入输出,这时就要用fprintf函数和fscanf函数。
说明: 从函数名可以看到,它们只是在printf和scanf的前面加了一个字母f。它们的作用与printf函数和scanf函数相仿,都是格式化读写函数。只有一点不同: fprintf和fscanf函数的读写对象不是终端而是文件 |
它们的一般调用方式为:
fprintf(文件指针, 格式字符串, 输出表列); |
fscanf(文件指针, 格式字符串, 输出表列); |
使用方式如下:
fprintf (fp,″%d,%6.2f″,i,f); //将int型变量i和float型变量f的值按%d和%6.2f的格式输出到fp指向的文件中 |
fscanf (fp,″%d,%f″,&i,&f); //磁盘文件上如果有字符“3,4.5”,则从中读取整数3送给整型变量i,读取实数4.5送给float型变量f |
10.3.4 用二进制方式向文件读写一组数据
说明:
C语言允许用fread函数从文件中读一个数据块,用fwrite函数向文件写一个数据块。在读写时是以二进制形式进行的。在向磁盘写数据时,直接将内存中一组数据原封不动、不加转换地复制到磁盘文件上,在读入时也是将磁盘文件中若干字节的内容一批读入内存。 |
一般调用形式为:
fread(buffer, size, count, fp); |
fwrite(buffer, size, count, fp); |
解释: buffer:是一个地址。对fread,它是用来存放从文件读入的数据的存储区的地址。对fwrite,是要把此地址开始的存储区中的数据向文件输出(以上指的是起始地址) size:要读写的字节数 count:要读写多少个数据项(每个数据项长度为size) fp:FILE类型指针 |
使用例子如下
float f[10]; fread(f,4,10,fp); //从fp所指向的文件读入10个4个字节的数据,存储到数组f中 |
[例] 从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。
#include <stdio.h> #define SIZE 10 struct Student_type { char name[10]; int num; int age; char addr[15]; }stud[SIZE]; //定义全局结构体数组stud,包含10个学生数据 void save() //定义函数save,向文件输出SIZE个学生的数据 { FILE *fp; int i; if((fp=fopen("stu.dat","wb"))==NULL) //打开输出文件stu.dat { printf("cannot open file\n"); return; } for(i=0;i<SIZE;i++) if(fwrite(&stud[i],sizeof(struct Student_type),1,fp)!=1) printf("file write error\n"); fclose(fp); } int main() { int i; printf("Please enter data of students:\n"); for(i=0;i<SIZE;i++) //输入SIZE个学生的数据,存放在数组stud中 sc |
|