对函数功能不熟练。
对“rb”"rw"这种方式不是很理解,二进制文件方式?文件中看不到,但是
能输出并显示到控制台上。
1.从键盘输入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中
scanf("%s%d%d%s",stud[i].name,&stud[i].num,
&stud[i].age,stud[i].addr);
save();
return 0;
}
2.验证在磁盘文件stu.dat中是否已存在数据
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
struct Student_type
{ char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
int main()
{ int i;
FILE *fp;
if((fp=fopen("stu.dat","rb"))==NULL) //打开输入文件stu.dat
{ printf("cannot open file\n");
exit(0);
}
for(i=0;i<SIZE;i++)
{ fread(&stud[i],sizeof(struct Student_type),1,fp); //从fp指向的文件读入一组数据
printf("%-10s %4d %4d %-15s\n",
stud[i].name,stud[i].num,stud[i]. age,stud[i].addr);
//在屏幕上输出这组数据
}
fclose(fp); //关闭文件stu_list
return 0;
}
3.怎样向文件读写一个字符串
(1) 数据的存储方式
文本方式: 数据以字符方式(ASCII代码)存储到文件中。如整数12,送到文件时占2个字节,而不是4个字节。以文本方式保存的数据便于阅读。
二进制方式: 数据按在内存的存储状态原封不动地复制到文件。如整数12,送到文件时和在内存中一样占4个字节。
(2) 文件的分类
文本文件(ASCII文件): ? 文件中全部为ASCII字符。
二进制文件: 按二进制方式把在内存中的数据复制到文件的,称为二进制文件,即映像文件。
(3) 文件的打开方式
文本方式: 不带b的方式,读写文件时对换行符进行转换。
二进制方式: 带b的方式,读写文件时对换行符不进行转换。
(4) 文件读写函数
文本读写函数: 用来向文本文件读写字符数据的函数(如fgetc,fgets,fputc,fputs,fscanf,fprintf等)。
二进制读写函数: 用来向二进制文件读写二进制数据的函数(如getw,putw,fread,fwrite等)。
4.有一个磁盘文件,内有一些信息。要求第1次将它的内容显示在屏幕上,第2次把它复制到另一文件上。
#include<stdio.h>
int main()
{ char ch;
FILE *fp1,*fp2;
fp1=fopen("file1.dat","r"); //打开输入文件
fp2=fopen("file2.dat","w"); //打开输出文件
ch=getc(fp1); //从file1.dat文件读入第一个字符
while(!feof(fp1)) //当未读取文件尾标志
{ putchar(ch); //在屏幕输出一个字符
ch=getc(fp1); //再从file1.dat文件读入一个字符
}
putchar(10); //在屏幕执行换行
rewind(fp1); //使文件位置标记返回文件开头
ch=getc(fp1); //从file1.dat文件读入第一个字符
while(!feof(fp1)) //当未读取文件尾标志
{ fputc(ch,fp2); //向file2.dat文件输出一个字符
ch=fgetc(fp1); //再从file1.dat文件读入一个字符
}
fclose(fp1);fclose(fp2);
return 0;
}
5.在磁盘文件上存有10个学生的数据。要求将第1,3,5,7,9个学生数据输入计算机,并在屏幕上显示出来。
#include<stdio.h>
#include <stdlib.h>
struct Student_type //学生数据类型
{ char name[10];
int num;
int age;
char addr[15];
}stud[10];
int main()
{ int i;
FILE *fp;
if((fp=fopen("stu.dat","rb"))==NULL) //以只读方式打开二进制文件
{ printf("can not open file\n");
exit(0);
}
for(i=0;i<10;i+=2)
{ fseek(fp,i*sizeof(struct Student_type),0); //移动文件位置标记
fread(&stud[i],sizeof(struct Student_type),1,fp); //读一个数据块到结构体变量
printf("%-10s %4d %4d %-15s\n",
stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
//在屏幕输出
}
fclose(fp);
return 0;
}
|