C语言文件进阶

Description
文件a.dic、b.dic、c.dic中分别存有张三的三科成绩,每个文件都是16字节:前8个字节存储其英文名字zhangsan,后面是一个空格,其后的2个字节存储其年龄(文本方式存储)
,后面也是一个空格,最后4个字节存储的是某科考试成绩(二进制方式存储)。键盘输入一个数字(1,2,3),根据输入的数字从相应的文件中读出张三的数据并显示。

数字和文件的对应关系是:

1----a.dic

2----b.dic

3----c.dic

Input
输入1、2、3中的一个
Output
输出张三的数据,每项一行
Sample Input
1
Sample Output
zhangsan
18
96
Code 1 here:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main()
 4 {
 5     FILE *fp;
 6     char name[9];
 7     int n,age,score;
 8     scanf("%d",&n);
 9     if(n==1)
10         if((fp=fopen("C:\\vc\\a.dic","r"))==NULL)
11         {
12             printf("打开文件失败\n");
13             exit(1);
14         }
15     if(n==2)
16         if((fp=fopen("C:\\vc\\b.dic","r"))==NULL)
17         {
18             printf("打开文件失败\n");
19             exit(1);
20         }
21     if(n==3)
22         if((fp=fopen("c.dic","r"))==NULL)
23         {
24             printf("打开文件失败\n");
25             exit(1);
26         }
27     fgets(name,9,fp);///读取n-1个字符
28     fscanf(fp,"%d",&age);///无视空格
29     fgetc(fp);///去掉空格
30     fread(&score,4,1,fp);///二进制方式读取
31     fclose(fp);///关闭文件
32     printf("%s\n%d\n%d\n",name,age,score);
33     return 0;
34 }

Description
文件中存有3个人的姓名和数据(数据是不超过10000的整数),姓名是文本方式存储的,数据是二进制方式存储的,姓名和数据之间有一个空格,
当初这些数据是通过以下代码写进去的:
fp=fopen(filename,"wb"); //filename是数组名,其中存有文件名
for(i=1;i<=3;i++)
{
scanf("%s",name);
scanf("%d",&score);
fprintf(fp,"%s ",name); //%s后面有一个空格
fwrite(&score,4,1,fp);

}

文件已在后台,键盘输入文件名,读出并显示文件中的数据

Input
输入文件名

Output
输出三个人的数据

Sample Input
sample.dic

Sample Output
zhang,1990
wang,9678
sun,789

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main()
 4 {
 5     FILE *fp;
 6     int i,score;
 7     char filename[20],name[9];
 8     fp=fopen(gets(filename),"wb+");///取文件名的方法
 9     for(i=1; i<=3; i++)
10     {
11         scanf("%s",name);
12         scanf("%d",&score);
13         fprintf(fp,"%s ",name///%s后面有一个空格
14         fwrite(&score,4,1,fp);
15     }
16     rewind(fp);///读写转换
17     for(i=1; i<=3; i++)
18     {
19         fscanf(fp,"%s",name);
20         fgetc(fp);///名字与成绩之间有空格需要fgetc取走或者fseek(fp,1,1);
21         fread(&score,4,1,fp);
22         printf("%s,%d\n",name,score);
23     }
24     return 0;
25 }

从键盘中输入学生的学号,姓名,班级,成绩到文件中,按照成绩高低排名,输出到显示器(每一个内容之间有两个空格)

文件中的内容
1 wkf 1 78
2 ygh 1 88
3 wl 1 99
4 tcm 1 98
1 liuxc 1 67

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 # define N 5///宏定义,可以用来设定有多少个学生的信息
 4 typedef struct student
 5 {
 6     unsigned num;
 7     char name[9];
 8     unsigned cla;
 9     int score;
10 } STU; ///结构体来存储一个人的各种信息
11 void input()
12 {
13     STU s;
14     FILE *fp;
15     int i;
16     fp=fopen("C:\\vc\\b.dic","w+");
17     if(fp==0)
18     {
19         printf("File Open Error!\n");
20         exit(1);
21     }
22 
23     for(i=1; i<=N; i++)
24     {
25         scanf("%d%s%d%d",&s.num,s.name,&s.cla,&s.score);///输入班级和成绩
26         fprintf(fp,"%2d %-8s %d%3d\n",s.num,s.name,s.cla,s.score);
27     }
28     fclose(fp);
29 }///向文件中输入
30 void output()
31 {
32     STU s[N],t;///因为要排序,所以要使用数组
33     FILE *fp;
34     int i,j,k;
35     fp=fopen("C:\\vc\\b.dic","r+");
36     if(fp==0)
37     {
38         printf("File Open Error!\n");
39         exit(1);
40     }
41     for(i=0; i<=N-1; i++)
42     {
43         fscanf(fp,"%d",&s [i].num);
44         fseek(fp,2,1);///要跳出name之后的两个空格
45         fgets(s[i].name,9,fp);///使用fgets的原因是为了防止名字中出现空格
46         fscanf(fp,"%d%d",&s[i].cla,&s[i].score);
47 
48     }
49     fclose(fp);
50     for(i=0; i<=N-2; i++) ///选择法排序
51     {
52         k=i;
53         for(j=i+1; j<=N-1; j++)
54             if(s[j].score>s[k].score)
55                 k=j;
56         t=s[i];
57         s[i]=s[k];
58         s[k]=t;
59     }
60     for(i=0; i<=N-1; i++)
61         printf("%d  %s  %d  %d\n",s[i].num,s[i].name,s[i].cla,s[i].score);
62 }
63 int main()
64 {
65     input();
66     output();
67     return 0;
68 }

Description
用二进制方式打开文件并向文件中写了若干人的数据,每人的数据都有两项:其一是名字,是用文本方式写的,
其二是薪金(整数),是用二进制方式写的,名字后面和薪金后面各存有一个空格,每人都如此。除此之外文件中再无其他内容
即:文件中数据的存储顺序是名字 薪金 名字 薪金 名字 薪金......名字 薪金
文件已存在,键盘输入文件名,按顺序读出并显示所有人的数据。
说明:

1、所有人的名字中都不含空格,即:没有诸如“Bill Gates” 之类的名字

2、最后一个人的薪金之后,也有一个空格

3、OJ平台不支持fseek()函数,程序中不能使用fseek(),但你可以利用“读数据时读写位置指针会自动移动”这一特点来移动指针

4、文件在当前目录中,打开文件时不需要考虑盘符和路径

提示:若需要一个文件来验证程序的运行结果,可自行编程建立一个
Input
输入文件名
Output
输出所有人的数据
Sample Input

a.dic
Sample Output

zhangsan,2000
lisi,8000

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main()
 4 {
 5     FILE *fp;
 6     int score;
 7     char filename[20],name[9];
 8     fp=fopen(gets(filename),"rb");
 9     fscanf(fp,"%s",name);///读取名字
10     fgetc(fp);///取掉空格
11     fread(&score,4,1,fp);///二进制读成绩
12     while(!feof(fp))
13     {
14         printf("%s,%d\n",name,score);
15         fscanf(fp,"%s",name);
16         fgetc(fp);
17         fread(&score,4,1,fp);
18     }
19     return 0;
20 }

猜你喜欢

转载自www.cnblogs.com/wkfvawl/p/9164416.html