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[];
  7. int n,age,score;
  8. scanf("%d",&n);
  9. if(n==)
  10. if((fp=fopen("C:\\vc\\a.dic","r"))==NULL)
  11. {
  12. printf("打开文件失败\n");
  13. exit();
  14. }
  15. if(n==)
  16. if((fp=fopen("C:\\vc\\b.dic","r"))==NULL)
  17. {
  18. printf("打开文件失败\n");
  19. exit();
  20. }
  21. if(n==)
  22. if((fp=fopen("c.dic","r"))==NULL)
  23. {
  24. printf("打开文件失败\n");
  25. exit();
  26. }
  27. fgets(name,,fp);///读取n-1个字符
  28. fscanf(fp,"%d",&age);///无视空格
  29. fgetc(fp);///去掉空格
  30. fread(&score,,,fp);///二进制方式读取
  31. fclose(fp);///关闭文件
  32. printf("%s\n%d\n%d\n",name,age,score);
  33. return ;
  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[],name[];
  8. fp=fopen(gets(filename),"wb+");///取文件名的方法
  9. for(i=; i<=; i++)
  10. {
  11. scanf("%s",name);
  12. scanf("%d",&score);
  13. fprintf(fp,"%s ",name///%s后面有一个空格
  14. fwrite(&score,,,fp);
  15. }
  16. rewind(fp);///读写转换
  17. for(i=; i<=; i++)
  18. {
  19. fscanf(fp,"%s",name);
  20. fgetc(fp);///名字与成绩之间有空格需要fgetc取走或者fseek(fp,1,1);
  21. fread(&score,,,fp);
  22. printf("%s,%d\n",name,score);
  23. }
  24. return ;
  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 ///宏定义,可以用来设定有多少个学生的信息
  4. typedef struct student
  5. {
  6. unsigned num;
  7. char name[];
  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==)
  18. {
  19. printf("File Open Error!\n");
  20. exit();
  21. }
  22.  
  23. for(i=; 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==)
  37. {
  38. printf("File Open Error!\n");
  39. exit();
  40. }
  41. for(i=; i<=N-; i++)
  42. {
  43. fscanf(fp,"%d",&s [i].num);
  44. fseek(fp,,);///要跳出name之后的两个空格
  45. fgets(s[i].name,,fp);///使用fgets的原因是为了防止名字中出现空格
  46. fscanf(fp,"%d%d",&s[i].cla,&s[i].score);
  47.  
  48. }
  49. fclose(fp);
  50. for(i=; i<=N-; i++) ///选择法排序
  51. {
  52. k=i;
  53. for(j=i+; j<=N-; 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=; i<=N-; 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 ;
  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[],name[];
  8. fp=fopen(gets(filename),"rb");
  9. fscanf(fp,"%s",name);///读取名字
  10. fgetc(fp);///取掉空格
  11. fread(&score,,,fp);///二进制读成绩
  12. while(!feof(fp))
  13. {
  14. printf("%s,%d\n",name,score);
  15. fscanf(fp,"%s",name);
  16. fgetc(fp);
  17. fread(&score,,,fp);
  18. }
  19. return ;
  20. }

Description
文件aaa.dic、bbb.dic都是数据库文件(都在当前目录中)。数据库文件的文件头是一种固定的结构,如下表所示

文件头结构的内容是二进制方式存储的,从键盘输入一个数字,打开相应的数据库文件,求该数据库文件总共有多少条记录、有多少个字段、

键盘输入数字与数据库文件的对应关系是:

1--------aaa.dic

2--------bbb.dic

Input
输入1或者2,代表要打开不同的文件

Output
输出三个整数,每个一行

Sample Input
1

Sample Output
10
5
29

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. FILE *fp;
  6. int n,a,b,c,x;
  7. scanf("%d",&n);
  8. if(n==)
  9. if((fp=fopen("aaa.dic","rb"))==NULL)
  10. {
  11. printf("打开文件失败\n");
  12. exit();
  13. }
  14. if(n==)
  15. if((fp=fopen("bbb.dic","rb"))==NULL)
  16. {
  17. printf("打开文件失败\n");
  18. exit();
  19. }
  20. fseek(fp,,);
  21. fread(&a,,,fp);///记录数
  22. fread(&b,,,fp);///文件头的总长度
  23. x=(b--)/;///字段数,1为文件头结束标志
  24. fread(&c,,,fp);///每条记录的长度
  25. fclose(fp);
  26. printf("%d\n%d\n%d\n",a,x,c);
  27. return ;
  28. }
  1. #include<stdio.h>//利用结构体将文件头中的所有信息都存储到一起
  2. #include <stdlib.h>
  3. struct HEAD
  4. {
  5. char file_type;
  6. char date[];
  7. int rec_num;
  8. short head_size;
  9. short rec_size;
  10. };
  11. int main()
  12. {
  13. FILE *fp;
  14. struct HEAD head;
  15. int n;
  16. scanf("%d",&n);
  17. if(n==)
  18. fp=fopen("aaa.dic","r");
  19. if(n==)
  20. fp=fopen("bbb.dic","r");
  21. if(fp==NULL)
  22. {
  23. printf("打开文件失败\n");
  24. exit();
  25. }
  26. fread(&head,,,fp);
  27. printf("%d\n%d\n%d\n",head.rec_num,(head.head_size-)/,head.rec_size);
  28. return ;
  29.  
  30. }

文件aaa.dic、bbb.dic都是数据库文件(都在当前目录中)。数据库文件的文件头是一种固定的结构,如下表所示

文件头结构的内容是二进制方式存储的。

从键盘输入一个数字,打开相应的数据库文件(1--aaa.dic,2--bbb.dic),已知数据库中肯定有math这个字段(字段名:math),编程求出以下信息:

1、字段长度(或字段宽度,即该字段的信息占几个字节);

2、字段的值有几位小数;

3、该字段的值在一条记录中所处的起始位置。

例如:设某数据库文件各字段的描述如下:

字段名
name
English
addr
age
computer
math

字段类型
C(字符)
N(数值)
C
N
N
N

字段宽度
10
5
20
3
5
4

小数位数
2
0
2
1

起始位置
1
11
23
16
43
19

则一条完整记录总共48(1+10+5+20+3+5+4)字节。

(开头第0字节用来存储空格或者星号,若是空格,表示本记录未被删除,若是星号,表示本记录已被逻辑删除)

下面是一条记录的内容:

zhangsan 78.25 1982.0sdibt 92.10 (本行是记录内容,共48字节)

012345678901234567890123456789012345678901234567890 (本行为了方便计数,并非记录内容)

其中:name字段的值是zhangsan(后面有两个空格),English的值是78.25,age是19(前面有一个空格),math是82.0,addr是sdibt(后面15个空格),computer是92.10

上面的数据中,字段math的值(82.0)在本记录中的起始位置是19。任意一条记录都是从第19字节(开头算第0字节)开始存储math的数据的,占多少字节由字段宽度决定。

特别说明:在OJ上提交的代码中,不允许使用fseek函数。(提示:读数据也可以移动指针)

Input
输入1或者2,以决定打开哪个文件

Output
输出所求的三个数据,每个一行

Sample Input
1

Sample Output
5
2
14

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5. FILE *fp;
  6. int n;
  7. char a,b,c,d;
  8. scanf("%d",&n);
  9. if(n==)
  10. if((fp=fopen("aaa.dic","rb"))==NULL)
  11. {
  12. printf("打开文件aaa.dic失败\n");
  13. exit();
  14. }
  15. if(n==)
  16. if((fp=fopen("bbb.dic","rb"))==NULL)
  17. {
  18. printf("打开文件bbb.dic失败\n");
  19. exit();
  20. }
  21. fseek(fp,,);
  22. while()///使用一个字符一个字符比对的方法
  23. {
  24. a=fgetc(fp);
  25. b=fgetc(fp);
  26. c=fgetc(fp);
  27. d=fgetc(fp);
  28. if(a=='m'&&b=='a'&&c=='t'&&d=='h')
  29. break;
  30. else
  31. fseek(fp,,);
  32. }
  33. fseek(fp,,);
  34. /*fread(math,1,10,fp);///使用strcmp比对,不成功就跳到下一个字段
  35. while(strcmp(math,"math")!=0)
  36. {
  37. fseek(fp,22,1);
  38. fread(math,1,10,fp);
  39. }*/
  40. fread(&c,,,fp);///本字段在记录中的起始位置
  41. fread(&a,,,fp);///字段宽度
  42. fread(&b,,,fp);///小数位数
  43. fclose(fp);
  44. printf("%d\n%d\n%d\n",a,b,c);
  45. return ;
  46. }
  1. #include<stdio.h>///利用结构体
  2. #include <stdlib.h>
  3. #include<string.h>
  4. struct HEAD///文件头
  5. {
  6. char file_type;
  7. char date[];
  8. int rec_num;
  9. short head_size;
  10. short rec_size;
  11. };
  12. struct FIELD///字段
  13. {
  14. char name[];///字段名
  15. char empty_c;///
  16. char type;///字段类型
  17. int begin;///字段在记录中的起始位置
  18. char width;///字段长度
  19. char digit;///小数位数
  20. };
  21. int main()
  22. {
  23. FILE *fp;
  24. struct HEAD head;
  25. struct FIELD field;
  26. int n,i,field_num;
  27. scanf("%d",&n);
  28. if(n==)
  29. fp=fopen("aaa.dic","r");
  30. if(n==)
  31. fp=fopen("bbb.dic","r");
  32. if(fp==NULL)
  33. {
  34. printf("打开文件失败\n");
  35. exit();
  36. }
  37. fread(&head,,,fp);///有效信息
  38. field_num=(head.head_size-)/;///字段的个数
  39. fseek(fp,,);
  40. for(i=; i<=field_num; i++)
  41. {
  42. fread(&field,,,fp);
  43. if(strcmp(field.name,"math")==)
  44. break;
  45. fseek(fp,,);
  46. }
  47. printf("%d\n%d\n%d\n",field.width,field.digit,field.begin);
  48. fclose(fp);
  49. return ;
  50. }

Description
键盘输入一个数字以打开相应的数据库文件(1---aaa.dic,2---bbb.dic),已知数据库文件中肯定有name和math两个字段且math起始位置大于name起始位置,请输出文件中第0条记录的name和math两个字段的值。math保留一位小数。有关数据库文件头的结构,请参看3591题目中的描述。文件头之后,是数据部分,数据部分的结构如下(所有内容都是文本方式存储的):如:Input
输入1或者2

Output
输出所求,分数保留一位小数(不设最小宽度)
Sample Input
1
Sample Output
qianqi
97.0

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. int main()
  5. {
  6. FILE *fp;
  7. int n,i,a,b,c;
  8. float num;
  9. char name[],math[],t;
  10. scanf("%d",&n);
  11. if(n==)
  12. if((fp=fopen("aaa.dic","r"))==NULL)
  13. {
  14. printf("打开文件aaa.dic失败\n");
  15. exit();
  16. }
  17. if(n==)
  18. if((fp=fopen("bbb.dic","r"))==NULL)
  19. {
  20. printf("打开文件bbb.dic失败\n");
  21. exit();
  22. }
  23. fseek(fp,,);
  24. fread(&a,,,fp);///文件头的总长度
  25. fseek(fp,,);
  26. fread(name,,,fp);///字段名
  27. while(strcmp(name,"name")!=)///直到读到name字段
  28. {
  29. fseek(fp,,);
  30. fread(name,,,fp);
  31. }
  32. fseek(fp,,);
  33. fread(&b,,,fp);///name字段在每条记录中的起始位置
  34. fread(&c,,,fp);///name字段的宽度
  35. fseek(fp,a+b,);///第一行name字段的位置
  36. t=fgetc(fp);
  37. for(i=; t!=&&i<=c; i++)
  38. {
  39. printf("%c",t);
  40. t=fgetc(fp);
  41. }
  42. printf("\n");
  43. fseek(fp,,);
  44. fread(math,,,fp);
  45. while(strcmp(math,"math")!=)
  46. {
  47. fseek(fp,,);
  48. fread(math,,,fp);
  49. }
  50. fseek(fp,,);
  51. fread(&b,,,fp);
  52. fread(&c,,,fp);
  53. fseek(fp,a+b,);
  54. fscanf(fp,"%f",&num);///此题使用fscanf有漏洞,因为math字段之后可能也储存着其他字段的数据,fscanf也会将其读出来,可能是因为保留一位小数的原因能够ac
  55. printf("%.1f",num);///应该使用组装实数的方法,自己来推出fscanf函数的运算原理,分成小数点之前和之后两部分
  56. return ;
  57. }
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4. struct HEAD///文件头
  5. {
  6. char file_type;
  7. char date[];///最后修改的日期
  8. int rec_num;///记录数
  9. short head_size;///文件头的总长度
  10. short rec_size;///每条记录的长度
  11. };
  12. struct FIELD///字段
  13. {
  14. char name[];///字段名
  15. char empty_c;///
  16. char type;///字段类型
  17. int begin;///字段在记录中的起始位置
  18. char width;///字段长度
  19. char digit;///小数位数
  20. };
  21. int main()
  22. {
  23. FILE *fp;
  24. struct HEAD head;
  25. struct FIELD field;
  26. int n,i,field_num,len;
  27. float num;
  28. char t;
  29. scanf("%d",&n);
  30. if(n==)
  31. fp=fopen("aaa.dic","r");
  32. if(n==)
  33. fp=fopen("bbb.dic","r");
  34. if(fp==NULL)
  35. {
  36. printf("打开文件失败\n");
  37. exit();
  38. }
  39. fread(&head,,,fp);///有效信息
  40. field_num=(head.head_size-)/;///字段的个数
  41. fseek(fp,,);
  42. for(i=; i<=field_num; i++)
  43. {
  44. fread(&field,,,fp);
  45. if(strcmp(field.name,"name")==)
  46. break;
  47. fseek(fp,,);
  48. }
  49. len=head.head_size+field.begin;
  50. fseek(fp,len,);///跳到第0行name字段的位置
  51. t=fgetc(fp);
  52. for(i=; t!=&&i<=field.width; i++)
  53. {
  54. printf("%c",t);
  55. t=fgetc(fp);
  56. }
  57. printf("\n");
  58. fseek(fp,,);
  59. for(i=; i<=field_num; i++)
  60. {
  61. fread(&field,,,fp);
  62. if(strcmp(field.name,"math")==)
  63. break;
  64. fseek(fp,,);
  65. }
  66. len=head.head_size+field.begin;
  67. fseek(fp,len,);///跳到第0行math字段的位置
  68. fscanf(fp,"%f",&num);
  69. printf("%.1f",num);
  70. fclose(fp);
  71. return ;
  72. }

C语言文件进阶操作的更多相关文章

  1. c语言文件读写操作总结

    C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...

  2. 03- Linux目录与文件进阶操作

    第三课 目录与文件进阶操作cat (一次性全部输出文件内容)   cat -n 文件名 显示行号   cat -b 文件名 空行不显示行号less (分页显示,可以上下翻页,光标键上下键,PageUp ...

  3. C语言文件读写操作

    C语言实现文件读写,注意区分几个方法: 写入: fwrite() //个人认为这个最好,可是实现写入任何数据类型,任何长度 fputs() //写入一个字符串,字符串长度不能太长,具体的长度未知,但估 ...

  4. GO语言的进阶之路-Golang字符串处理以及文件操作

    GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...

  5. go语言之进阶篇文件常用操作接口介绍和使用

    一.文件常用操作接口介绍 1.创建文件 法1: 推荐用法 func Create(name string) (file *File, err Error) 根据提供的文件名创建新的文件,返回一个文件对 ...

  6. go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

    go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...

  7. C语言文件操作

    C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...

  8. C语言文件操作相关函数

    在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...

  9. C 语言文件操作

    C 语言文件操作 1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...

随机推荐

  1. mac appstore应用下载失败,不能更新等等问题,都可以解决

    打开终端,输入以下命令 open `getconf DARWIN_USER_CACHE_DIR`/com.apple.appstore 进入目录,删除 com.apple.appstore  重启系 ...

  2. [异常笔记]启动DFS报错:Cannot find configuration directory: /etc/hadoop

    [hadoop@master ~]$ start-dfs.sh Incorrect configuration: namenode address dfs.namenode.servicerpc-ad ...

  3. react之styled-components(基础篇)

    介绍 它是react的一个库,可以用来美化组件 它的写法依赖于es6,依赖于webpack 安装 -yarn add styled-components 基本使用的一些方法 -as -Adapting ...

  4. 报错: Name node is in safe mode

    将本地文件拷贝到hdfs上去,结果上错误:Name node is in safe mode 这是因为在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统 ...

  5. Discuz被挂马 快照被劫持跳转该如何处理 如何修复discuz漏洞

    Discuz 3.4是目前discuz论坛的最新版本,也是继X3.2.X3.3来,最稳定的社区论坛系统.目前官方已经停止对老版本的补丁更新与升级,直接在X3.4上更新了,最近我们SINE安全在对其安全 ...

  6. Python学习笔记六:集合

    集合 Set,去重,关系测试:交.并.差等:无序 list_1=set(list_1), type(list_1) list_2=set([xxxxx]) 交集:list_1.intersectin( ...

  7. Redis的n种妙用,不仅仅是缓存

    redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset) Redis用作缓存,主要两个用途: ...

  8. C#实现窗口最小化到系统托盘

    先添加notifyicon控件notifyIcon1 using System; using System.Collections.Generic; using System.ComponentMod ...

  9. 西安Uber优步司机奖励政策(8月10日到8月16日)

    1) 工作日(周一到周五)早高峰时间段(7点到9:30点).晚高峰时间段(5点到8点)车费 2.0 倍,每单奖励部分上限35元 例:在高峰时段中,假设行程基本车费为¥15,只要达到奖励前提,最后你将获 ...

  10. 【LG1393】动态逆序对

    [LG1393]动态逆序对 题面 洛谷 题解 \(CDQ\)分治,按照时间来分治 应为一个删除不能对前面的操作贡献,所以考虑一个删除操作对它后面时间的操作的贡献 用上一个答案减去次贡献即可 代码 #i ...