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:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
char name[];
int n,age,score;
scanf("%d",&n);
if(n==)
if((fp=fopen("C:\\vc\\a.dic","r"))==NULL)
{
printf("打开文件失败\n");
exit();
}
if(n==)
if((fp=fopen("C:\\vc\\b.dic","r"))==NULL)
{
printf("打开文件失败\n");
exit();
}
if(n==)
if((fp=fopen("c.dic","r"))==NULL)
{
printf("打开文件失败\n");
exit();
}
fgets(name,,fp);///读取n-1个字符
fscanf(fp,"%d",&age);///无视空格
fgetc(fp);///去掉空格
fread(&score,,,fp);///二进制方式读取
fclose(fp);///关闭文件
printf("%s\n%d\n%d\n",name,age,score);
return ;
}
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
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int i,score;
char filename[],name[];
fp=fopen(gets(filename),"wb+");///取文件名的方法
for(i=; i<=; i++)
{
scanf("%s",name);
scanf("%d",&score);
fprintf(fp,"%s ",name///%s后面有一个空格
fwrite(&score,,,fp);
}
rewind(fp);///读写转换
for(i=; i<=; i++)
{
fscanf(fp,"%s",name);
fgetc(fp);///名字与成绩之间有空格需要fgetc取走或者fseek(fp,1,1);
fread(&score,,,fp);
printf("%s,%d\n",name,score);
}
return ;
}
从键盘中输入学生的学号,姓名,班级,成绩到文件中,按照成绩高低排名,输出到显示器(每一个内容之间有两个空格)
文件中的内容
1 wkf 1 78
2 ygh 1 88
3 wl 1 99
4 tcm 1 98
1 liuxc 1 67
#include<stdio.h>
#include<stdlib.h>
# define N ///宏定义,可以用来设定有多少个学生的信息
typedef struct student
{
unsigned num;
char name[];
unsigned cla;
int score;
} STU; ///结构体来存储一个人的各种信息
void input()
{
STU s;
FILE *fp;
int i;
fp=fopen("C:\\vc\\b.dic","w+");
if(fp==)
{
printf("File Open Error!\n");
exit();
} for(i=; i<=N; i++)
{
scanf("%d%s%d%d",&s.num,s.name,&s.cla,&s.score);///输入班级和成绩
fprintf(fp,"%2d %-8s %d%3d\n",s.num,s.name,s.cla,s.score);
}
fclose(fp);
}///向文件中输入
void output()
{
STU s[N],t;///因为要排序,所以要使用数组
FILE *fp;
int i,j,k;
fp=fopen("C:\\vc\\b.dic","r+");
if(fp==)
{
printf("File Open Error!\n");
exit();
}
for(i=; i<=N-; i++)
{
fscanf(fp,"%d",&s [i].num);
fseek(fp,,);///要跳出name之后的两个空格
fgets(s[i].name,,fp);///使用fgets的原因是为了防止名字中出现空格
fscanf(fp,"%d%d",&s[i].cla,&s[i].score); }
fclose(fp);
for(i=; i<=N-; i++) ///选择法排序
{
k=i;
for(j=i+; j<=N-; j++)
if(s[j].score>s[k].score)
k=j;
t=s[i];
s[i]=s[k];
s[k]=t;
}
for(i=; i<=N-; i++)
printf("%d %s %d %d\n",s[i].num,s[i].name,s[i].cla,s[i].score);
}
int main()
{
input();
output();
return ;
}
Description
用二进制方式打开文件并向文件中写了若干人的数据,每人的数据都有两项:其一是名字,是用文本方式写的,
其二是薪金(整数),是用二进制方式写的,名字后面和薪金后面各存有一个空格,每人都如此。除此之外文件中再无其他内容
即:文件中数据的存储顺序是名字 薪金 名字 薪金 名字 薪金......名字 薪金
文件已存在,键盘输入文件名,按顺序读出并显示所有人的数据。
说明:
1、所有人的名字中都不含空格,即:没有诸如“Bill Gates” 之类的名字
2、最后一个人的薪金之后,也有一个空格
3、OJ平台不支持fseek()函数,程序中不能使用fseek(),但你可以利用“读数据时读写位置指针会自动移动”这一特点来移动指针
4、文件在当前目录中,打开文件时不需要考虑盘符和路径
提示:若需要一个文件来验证程序的运行结果,可自行编程建立一个
Input
输入文件名
Output
输出所有人的数据
Sample Input
a.dic
Sample Output
zhangsan,2000
lisi,8000
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int score;
char filename[],name[];
fp=fopen(gets(filename),"rb");
fscanf(fp,"%s",name);///读取名字
fgetc(fp);///取掉空格
fread(&score,,,fp);///二进制读成绩
while(!feof(fp))
{
printf("%s,%d\n",name,score);
fscanf(fp,"%s",name);
fgetc(fp);
fread(&score,,,fp);
}
return ;
}
Description
文件aaa.dic、bbb.dic都是数据库文件(都在当前目录中)。数据库文件的文件头是一种固定的结构,如下表所示
文件头结构的内容是二进制方式存储的,从键盘输入一个数字,打开相应的数据库文件,求该数据库文件总共有多少条记录、有多少个字段、
键盘输入数字与数据库文件的对应关系是:
1--------aaa.dic
2--------bbb.dic
Input
输入1或者2,代表要打开不同的文件
Output
输出三个整数,每个一行
Sample Input
1
Sample Output
10
5
29
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int n,a,b,c,x;
scanf("%d",&n);
if(n==)
if((fp=fopen("aaa.dic","rb"))==NULL)
{
printf("打开文件失败\n");
exit();
}
if(n==)
if((fp=fopen("bbb.dic","rb"))==NULL)
{
printf("打开文件失败\n");
exit();
}
fseek(fp,,);
fread(&a,,,fp);///记录数
fread(&b,,,fp);///文件头的总长度
x=(b--)/;///字段数,1为文件头结束标志
fread(&c,,,fp);///每条记录的长度
fclose(fp);
printf("%d\n%d\n%d\n",a,x,c);
return ;
}
#include<stdio.h>//利用结构体将文件头中的所有信息都存储到一起
#include <stdlib.h>
struct HEAD
{
char file_type;
char date[];
int rec_num;
short head_size;
short rec_size;
};
int main()
{
FILE *fp;
struct HEAD head;
int n;
scanf("%d",&n);
if(n==)
fp=fopen("aaa.dic","r");
if(n==)
fp=fopen("bbb.dic","r");
if(fp==NULL)
{
printf("打开文件失败\n");
exit();
}
fread(&head,,,fp);
printf("%d\n%d\n%d\n",head.rec_num,(head.head_size-)/,head.rec_size);
return ; }
文件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
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int n;
char a,b,c,d;
scanf("%d",&n);
if(n==)
if((fp=fopen("aaa.dic","rb"))==NULL)
{
printf("打开文件aaa.dic失败\n");
exit();
}
if(n==)
if((fp=fopen("bbb.dic","rb"))==NULL)
{
printf("打开文件bbb.dic失败\n");
exit();
}
fseek(fp,,);
while()///使用一个字符一个字符比对的方法
{
a=fgetc(fp);
b=fgetc(fp);
c=fgetc(fp);
d=fgetc(fp);
if(a=='m'&&b=='a'&&c=='t'&&d=='h')
break;
else
fseek(fp,,);
}
fseek(fp,,);
/*fread(math,1,10,fp);///使用strcmp比对,不成功就跳到下一个字段
while(strcmp(math,"math")!=0)
{
fseek(fp,22,1);
fread(math,1,10,fp);
}*/
fread(&c,,,fp);///本字段在记录中的起始位置
fread(&a,,,fp);///字段宽度
fread(&b,,,fp);///小数位数
fclose(fp);
printf("%d\n%d\n%d\n",a,b,c);
return ;
}
#include<stdio.h>///利用结构体
#include <stdlib.h>
#include<string.h>
struct HEAD///文件头
{
char file_type;
char date[];
int rec_num;
short head_size;
short rec_size;
};
struct FIELD///字段
{
char name[];///字段名
char empty_c;///
char type;///字段类型
int begin;///字段在记录中的起始位置
char width;///字段长度
char digit;///小数位数
};
int main()
{
FILE *fp;
struct HEAD head;
struct FIELD field;
int n,i,field_num;
scanf("%d",&n);
if(n==)
fp=fopen("aaa.dic","r");
if(n==)
fp=fopen("bbb.dic","r");
if(fp==NULL)
{
printf("打开文件失败\n");
exit();
}
fread(&head,,,fp);///有效信息
field_num=(head.head_size-)/;///字段的个数
fseek(fp,,);
for(i=; i<=field_num; i++)
{
fread(&field,,,fp);
if(strcmp(field.name,"math")==)
break;
fseek(fp,,);
}
printf("%d\n%d\n%d\n",field.width,field.digit,field.begin);
fclose(fp);
return ;
}
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
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
FILE *fp;
int n,i,a,b,c;
float num;
char name[],math[],t;
scanf("%d",&n);
if(n==)
if((fp=fopen("aaa.dic","r"))==NULL)
{
printf("打开文件aaa.dic失败\n");
exit();
}
if(n==)
if((fp=fopen("bbb.dic","r"))==NULL)
{
printf("打开文件bbb.dic失败\n");
exit();
}
fseek(fp,,);
fread(&a,,,fp);///文件头的总长度
fseek(fp,,);
fread(name,,,fp);///字段名
while(strcmp(name,"name")!=)///直到读到name字段
{
fseek(fp,,);
fread(name,,,fp);
}
fseek(fp,,);
fread(&b,,,fp);///name字段在每条记录中的起始位置
fread(&c,,,fp);///name字段的宽度
fseek(fp,a+b,);///第一行name字段的位置
t=fgetc(fp);
for(i=; t!=&&i<=c; i++)
{
printf("%c",t);
t=fgetc(fp);
}
printf("\n");
fseek(fp,,);
fread(math,,,fp);
while(strcmp(math,"math")!=)
{
fseek(fp,,);
fread(math,,,fp);
}
fseek(fp,,);
fread(&b,,,fp);
fread(&c,,,fp);
fseek(fp,a+b,);
fscanf(fp,"%f",&num);///此题使用fscanf有漏洞,因为math字段之后可能也储存着其他字段的数据,fscanf也会将其读出来,可能是因为保留一位小数的原因能够ac
printf("%.1f",num);///应该使用组装实数的方法,自己来推出fscanf函数的运算原理,分成小数点之前和之后两部分
return ;
}
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
struct HEAD///文件头
{
char file_type;
char date[];///最后修改的日期
int rec_num;///记录数
short head_size;///文件头的总长度
short rec_size;///每条记录的长度
};
struct FIELD///字段
{
char name[];///字段名
char empty_c;///
char type;///字段类型
int begin;///字段在记录中的起始位置
char width;///字段长度
char digit;///小数位数
};
int main()
{
FILE *fp;
struct HEAD head;
struct FIELD field;
int n,i,field_num,len;
float num;
char t;
scanf("%d",&n);
if(n==)
fp=fopen("aaa.dic","r");
if(n==)
fp=fopen("bbb.dic","r");
if(fp==NULL)
{
printf("打开文件失败\n");
exit();
}
fread(&head,,,fp);///有效信息
field_num=(head.head_size-)/;///字段的个数
fseek(fp,,);
for(i=; i<=field_num; i++)
{
fread(&field,,,fp);
if(strcmp(field.name,"name")==)
break;
fseek(fp,,);
}
len=head.head_size+field.begin;
fseek(fp,len,);///跳到第0行name字段的位置
t=fgetc(fp);
for(i=; t!=&&i<=field.width; i++)
{
printf("%c",t);
t=fgetc(fp);
}
printf("\n");
fseek(fp,,);
for(i=; i<=field_num; i++)
{
fread(&field,,,fp);
if(strcmp(field.name,"math")==)
break;
fseek(fp,,);
}
len=head.head_size+field.begin;
fseek(fp,len,);///跳到第0行math字段的位置
fscanf(fp,"%f",&num);
printf("%.1f",num);
fclose(fp);
return ;
}
C语言文件进阶操作的更多相关文章
- c语言文件读写操作总结
C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...
- 03- Linux目录与文件进阶操作
第三课 目录与文件进阶操作cat (一次性全部输出文件内容) cat -n 文件名 显示行号 cat -b 文件名 空行不显示行号less (分页显示,可以上下翻页,光标键上下键,PageUp ...
- C语言文件读写操作
C语言实现文件读写,注意区分几个方法: 写入: fwrite() //个人认为这个最好,可是实现写入任何数据类型,任何长度 fputs() //写入一个字符串,字符串长度不能太长,具体的长度未知,但估 ...
- GO语言的进阶之路-Golang字符串处理以及文件操作
GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...
- go语言之进阶篇文件常用操作接口介绍和使用
一.文件常用操作接口介绍 1.创建文件 法1: 推荐用法 func Create(name string) (file *File, err Error) 根据提供的文件名创建新的文件,返回一个文件对 ...
- go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )
go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...
- C语言文件操作
C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...
- C语言文件操作相关函数
在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...
- C 语言文件操作
C 语言文件操作 1. 数据流: 程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流. 所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...
随机推荐
- window.moveTo(),window.moveBy()不生效
window.moveTo()和window.moveBy的菜鸟教程介绍: moveTo() 方法可把窗口的左上角移动到一个指定的坐标. window.moveTo(x,y) moveBy() 方法可 ...
- 也说java虚拟机
学习java的人如果不了解java虚拟机,那真是白学了. java为什么可以跨平台,就是因为虚拟机的作用,java虚拟机就相当于一个计算机,它有自己的内存结构,当java程序 ...
- [翻译]Hystrix wiki–Home
注:本文并非是精确的文档翻译,而是根据自己理解的整理,有些内容可能由于理解偏差翻译有误,有些内容由于是显而易见的,并没有翻译,而是略去了.本文更多是学习过程的产出,请尽量参考原官方文档. 什么是Hys ...
- java synchronized 关键字原理
Synchronized 关键字是解决并发问题常用解决方案,有以下三种使用方式: 同步普通方法,锁的是当前对象.同步静态方法,锁的是当前 Class 对象.同步块,锁的是 {} 中的对象. 实现原理: ...
- Java设计模式(12)——结构型模式之门面模式(Facade)
一.概述 概念 简要示意图(没有一个统一的UML图) 角色 门面角色:门面模式核心,它被客户端调用,并且熟悉子系统 子系统角色:子系统,子系统并不知道门面的存在,门面对它来说只不过是另外一个客户端 ...
- .net core中Primitives.StringValues 处理
参考地址:https://stackoverflow.com/questions/36297329/primitives-stringvalues-how-to-deserialize-value-t ...
- WebService-CXF使用
一.SOAP和WSDL概念: SOAP(Simple Object Access Protocol):简单对象访问协议 SOAP作为一个基于XML语言的协议用于在网上传输数据 SOAP=在Http的基 ...
- golang 仿python pack/unpack
写得不完善也不完美 尤其是高低位转换那(go和c 二进制高地位相反 需要转换,还有go int转[]byte长度是4位),希望牛人看后指导一下 项目需要通过socket调取 客户端是go ,服务器端是 ...
- 几个常用的轻量级web服务
Node.js 安装:npm install http-server 使用:hs命令,可启动以当前目前为webroot的8080端口web服务,也可指定端口 Python 安装:内置 使用:pytho ...
- vim程序员加强功能
1.折叠 1.1折叠的方式有六种 manual:以标准的vim结构定义折叠跨越的范围,类似移动命令 indent:折叠与折叠的层次,对应于文本的缩排与 ...