• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
C语言教程:第十章:文件(2)
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
C语言教程:第十章:文件(2)
软件发布 C语言教程:第十章:文件(2)
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 认证考试 >> 计算机等级考试 >> 计算机等级考试动态 >> C语言教程:第十章:文件(2)

C语言教程:第十章:文件(2)

添加时间: 2007-5-25 6:44:46  作者: 计算机等级考试认证参考  阅读次数:52   来源: http://www.d9soft.com

       

C语言还提供了用于整块数据的读写函数。 可用来读写一组数据,如一个数组元素,一个结构变量的值等。读数据块函数调用的一般形式为: fread(buffer,size,count,fp); 写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp); 其中buffer是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示数据块的字节数。count 表示要读写的数据块块数。fp 表示文件指针。   
例如:   
fread(fa,4,5,fp); 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。   
[例10.6]从键盘输入两个学生数据,写入一个文件中, 再读出这两个学生的数据显示在屏幕上。   
#include   
struct stu   
{   
char name[10];   
int num;   
int age;   
char addr[15];   
}boya[2],boyb[2],*pp,*qq;   
main()   
{   
FILE *fp;   
char ch;   
int i;   
pp=boya;   
qq=boyb;   
if((fp=fopen("stu_list","wb+"))==NULL)   
{   
printf("Cannot open file strike any key exit!");   
getch();   
exit(1);   
}   
printf(" input data ");   
for(i=0;i<2;i++,pp++)   
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);   
pp=boya;   
fwrite(pp,sizeof(struct stu),2,fp);   
rewind(fp);   
fread(qq,sizeof(struct stu),2,fp);   
printf(" name number age addr ");   
for(i=0;i<2;i++,qq++)   
printf("%s %5d%7d%s ",qq->name,qq->num,qq->age,qq->addr);   
fclose(fp);   
}   
  本例程序定义了一个结构stu,说明了两个结构数组boya和 boyb以及两个结构指针变量pp和qq。pp指向boya,qq指向boyb。程序第16行以读写方式打开二进制文件“stu_list”,输入二个学生数据之后,写入该文件中, 然后把文件内部位置指针移到文件首,读出两块学生数据后,在屏幕上显示。   

格式化读写函数fscanf和fprintf   

fscanf函数,fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为: fscanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列); 例如:   
fscanf(fp,"%d%s",&i,s);   
fprintf(fp,"%d%c",j,ch);    
用fscanf和fprintf函数也可以完成例10.6的问题。修改后的程序如例10.7所示。   
[例10.7]   
#include   
struct stu   
{   
char name[10];   
int num;   
int age;   
char addr[15];   
}boya[2],boyb[2],*pp,*qq;   
main()   
{   
FILE *fp;   
char ch;   
int i;   
pp=boya;   
qq=boyb;   
if((fp=fopen("stu_list","wb+"))==NULL)   
{   
printf("Cannot open file strike any key exit!");   
getch();   
exit(1);   
}   
printf(" input data ");   
for(i=0;i<2;i++,pp++)

scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);   
pp=boya;   
for(i=0;i<2;i++,pp++)   
fprintf(fp,"%s %d %d %s ",pp->name,pp->num,pp->age,pp->   
addr);   
rewind(fp);   
for(i=0;i<2;i++,qq++)   
fscanf(fp,"%s %d %d %s ",qq->name,&qq->num,&qq->age,qq->addr);   
printf(" name number age addr ");   
qq=boyb;   
for(i=0;i<2;i++,qq++)   
printf("%s %5d %7d %s ",qq->name,qq->num, qq->age,   
qq->addr);   
fclose(fp);   
}   
  与例10.6相比,本程序中fscanf和fprintf函数每次只能读写一个结构数组元素,因此采用了循环语句来读写全部数组元素。 还要注意指针变量pp,qq由于循环改变了它们的值,因此在程序的25和32行分别对它们重新赋予了数组的首地址。   

文件的随机读写   

  前面介绍的对文件的读写方式都是顺序读写, 即读写文件只能从头开始,顺序读写各个数据。 但在实际问题中常要求只读写文件中某一指定的部分。 为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。 实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位移动文件内部位置指针的函数主要有两个, 即 rewind 函数和fseek函数。   

  rewind函数前面已多次使用过,其调用形式为: rewind(文件指针); 它的功能是把文件内部的位置指针移到文件首。 下面主要介绍   
fseek函数。   

  fseek函数用来移动文件内部位置指针,其调用形式为: fseek(文件指针,位移量,起始点); 其中:“文件指针”指向被移动的文件。 “位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。   
其表示方法如表10.2。    
起始点    表示符号    数字表示   
──────────────────────────   
文件首    SEEK—SET    0   
当前位置   SEEK—CUR    1   
文件末尾   SEEK—END     2   
例如:   
fseek(fp,100L,0);其意义是把位置指针移到离文件首100个字节处。还要说明的是fseek函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。文件的随机读写在移动位置指针之后, 即可用前面介绍的任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用fread和fwrite函数。下面用例题来说明文件的随机读写。   

[例10.8]在学生文件stu list中读出第二个学生的数据。   
#include   
struct stu   
{   
char name[10];   
int num;   
int age;   
char addr[15];   
}boy,*qq;   
main()   
{   
FILE *fp;   
char ch;   
int i=1;   
qq=&boy;   
if((fp=fopen("stu_list","rb"))==NULL)

{   
printf("Cannot open file strike any key exit!");   
getch();   
exit(1);   
}   
rewind(fp);   
fseek(fp,i*sizeof(struct stu),0);   
fread(qq,sizeof(struct stu),1,fp);   
printf(" name number age addr ");   
printf("%s %5d %7d %s ",qq->name,qq->num,qq->age,   
qq->addr);   
}   
  文件stu_list已由例10.6的程序建立,本程序用随机读出的方法读出第二个学生的数据。程序中定义boy为stu类型变量,qq为指向boy的指针。以读二进制文件方式打开文件,程序第22行移动文件位置指针。其中的i值为1,表示从文件头开始,移动一个stu类型的长度, 然后再读出的数据即为第二个学生的数据。

 

上下文章:

 

上一篇文章: 简明x86汇编语言教程(6) 下一篇文章: 三级考试经典问答

相关文章:

  • 用文件浏览器和图片查看器研究照片
  • 谷歌百科全书网站Knol推出多种语言服务
  • PS调色教程:教你调出婚片温柔暖色调
  • PS教程:打造都市颓废风格海报
  • PS教程:真人仿卡通手绘效果

相关软件:

  • 文件夹加密王[FeKing] v1.21
  • 意天文件恢复大师 v1.0.0.10
  • 易语言 V4.04 简体中文正式版
  • 超级秘密文件夹 5.89
  • 恶意网站HOSTS屏蔽文件 2008.10.20
  • 文件夹看门狗 3.6 白金版

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

计算机等级考试分类导航

  • 计算机等级考试动态
  • 计算机一级考试
  • 计算机二级考试
  • 计算机三级考试
  • 计算机四级考试

本类经典文章推荐

  • 全国计算机等级考试三级网络技术(...
  • 三级网络技术复习笔记(第1-2章)
  • 三级笔试样题(PC技术)
  • 三级数据库技术样题
  • 三级网络技术复习笔记(5-7)
  • 三级网络技术复习笔记(第3-4章)
  • 笔试样题(网络技术)
  • 机考如何避免范围性错误
  • 2003年最新三级网络模拟题(2)
  • 全国计算机等级考试三级网络技术部...

计算机等级考试动态阅读排行

  • 9月17日计算机等级考试二级VF答案
  • 完整的计算机等级考试上机模拟系统
  • 计算机等级考试:VFp练习题1
  • 全国计算机等级考试三级网络技术(...
  • 历年操作系统论述题及答案(2)
  • 计算机等级考试:VFp练习题2
  • 计算机二级VB软件环境、考试时间、...
  • 2005年全国计算机等级考试全真模拟...
  • 三级网络技术复习笔记(第1-2章)
  • 全国计算机等级考试报名时间、级别...

计算机等级考试阅读总排行

  • 全国计算机等级考试一级模拟试题01
  • 全国计算机等级考试一级模拟试题10
  • 全国计算机等级考试一级模拟试题08
  • 全国计算机等级考试一级考试最新模...
  • 全国计算机等级考试一级模拟试题02
  • 全国计算机等级考试一级模拟试题07
  • 全国计算机等级考试上机考试应试技...
  • 一级(WINDOWS)试题解析-Word篇
  • 全国计算机等级考试一级模拟试题06
  • 全国计算机等级考试一级模拟试题03

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有