当前位置 首页 C语言设计第三版 第52章

《C语言设计第三版》第52章

作者:谭浩强 字数:1515 书籍:C语言设计第三版

  还要注意指针变量 pp,qq 由于循环改变了它们的值,

  因此在程序的 25 和 32 行分别对它们重新赋予了数组的首地址。

  13.5 文件的随机读写

  前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个

  数据。 但在实际问题中常要求只读写文件中某一指定的部分。为了解决这个问题可移动文件

  内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。

  实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。

  13.5.1 文件定位

  移动文件内部位置指针的函数主要有两个,即 rewind 函数和 fseek 函数。

  rewind 函数前面已多次使用过,其调用形式为:

  rewind(文件指针);

  它的功能是把文件内部的位置指针移到文件首。

  下面主要介绍 fseek 函数。

  fseek 函数用来移动文件内部位置指针,其调用形式为:

  fseek(文件指针,位移量,起始点);

  其中:

  “文件指针”指向被移动的文件。

  “位移量”表示移动的字节数,要求位移量是 long 型数据,以便在文件长度大于 64KB 时不

  会出错。当用常量表示位移量时,要求加后缀“L”。

  “起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。

  其表示方法如下表。

  例如:

  起始点

  文件首

  当前位置

  文件末尾

  表示符号

  SEEK_SET

  SEEK_CUR

  SEEK_END

  数字表示

  0

  1

  2

  fseek(fp,100L,0);

  其意义是把位置指针移到离文件首 100 个字节处。

  还要说明的是 fseek 函数一般用于二进制文件。在文本文件中由于要进行转换,故往往

  计算的位置会出现错误。

  13.5.2 文件的随机读写

  在移动位置指针之后,即可用前面介绍的任一种读写函数进行读写。由于一般是读写一

  个数据据块,因此常用 fread 和 fwrite 函数。

  下面用例题来说明文件的随机读写。

  【例 13.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("\n\nname\tnumber age addr\n");

  printf("%s\t%5d %7d %s\n",qq->name,qq->num,qq->age,

  qq->addr);

  }

  文件 stu_list 已由例 13.6 的程序建立,本程序用随机读出的方法读出第二个学生的数

  据。程序中定义 boy 为 stu 类型变量,qq 为指向 boy 的指针。以读二进制文件方式打开文件,

  程序第 22 行移动文件位置指针。其中的 i 值为 1,表示从文件头开始,移动一个 stu 类型的

  长度,然后再读出的数据即为第二个学生的数据。

  13.6 文件检测函数

  C语言中常用的文件检测函数有以下几个。

  13.6.1 文件结束检测函数 feof 函数

  调用格式:

  feof(文件指针);

  功能:判断文件是否处于文件结束位置,如文件结束,则返回值为 1,否则为 0。

  13.6.2 读写文件出错检测函数

  ferror 函数调用格式:

  ferror(文件指针);

  功能:检查文件在用各种输入输出函数进行读写时是否出错。如 ferror 返回值为 0 表示未出

  错,否则表示有错。

  13.6.3 文件出错标志和文件结束标志置 0 函数

  clearerr 函数调用格式:

  clearerr(文件指针);

  功能:本函数用于清除出错标志和文件结束标志,使它们为 0 值。

  13.7 C库文件

  C系统提供了丰富的系统文件,称为库文件,C 的库文件分为两类,一类是扩展名为".h"

  的文件,称为头文件,在前面的包含命令中我们已多次使用过。在".h"文件中包含了常量定

  义、 类型定义、宏定义、函数原型以及各种编译选择设置等信息。另一类是函数库,包括了

  各种函数的目标代码,供用户在程序中调用。 通常在程序中调用一个库函数时,要在调用之

  前包含该函数原型所在的".h" 文件。

  下面给出 Turbo C 的全部".h"文件。

  Turbo C 头文件

  ? ALLOC.H 说明内存管理函数(分配、释放等)。

  ? ASSERT.H 定义 assert 调试宏。

  ? BIOS.H 说明调用 IBM—PC ROM BIOS 子程序的各个函数。

  ? CONIO.H 说明调用 DOS 控制台 I/O 子程序的各个函数。

  ? CTYPE.H 包含有关字符分类及转换的名类信息(如 isalpha 和 toascii 等)。

  ? DIR.H 包含有关目录和路径的结构、宏定义和函数。

  ? DOS.H 定义和说明 MSDOS 和 8086 调用的一些常量和函数。

  ? ERRON.H 定义错误代码的助记符。

  ? FCNTL.H 定义在与 open 库子程序连接时的符号常量。

  ? FLOAT.H 包含有关浮点运算的一些参数和函数。

  ? GRAPHICS.H 说明有关图形功能的各个函数,图形错误代码的常量定义,正对不同

  驱动程序的各种颜色值,及函数用到的一些特殊结构。

  ? IO.H 包含低级 I/O 子程序的结构和说明。

  ? LIMIT.H 包含各环境参数、编译时间限制、数的范围等信息。

  ? MATH.H 说明数学运算函数,还定了 HUGE VAL 宏, 说明了 matherr 和

  matherr 子程序用到的特殊结构。

  ? MEM.H 说明一些内存操作函数(其中大多数也在 STRING.H 中说明)。

  ? PROCESS.H 说明进程管理的各个函数,spawn…和 EXEC …函数的结构说明。

  ? SETJMP.H 定义 longjmp 和 setjmp 函数用到的 jmp buf 类型,说明这两个函数。

  ? SHARE.H 定义文件共享函数的参数。

  ? SIGNAL.H 定义 SIG[ZZ(Z] [ZZ)]IGN 和 SIG[ZZ(Z] [ZZ)]DFL 常量,说明

  rajse 和 signal 两个函数。

  ? STDARG.H 定义读函数参数表的宏。(如 vprintf,vscarf 函数)。

  ? STDDEF.H 定义一些公共数据类型和宏。

  ? STDIO.H 定义 Kernighan 和 Ritchie 在 Unix System V 中定义的标准和扩展

  的类型和宏。还定义标准 I/O 预定义流:stdin,stdout 和 stderr,说明 I/O 流子

  程序。

  ? STDLIB.H 说明一些常用的子程序:转换子程序、搜索/ 排序子程序等。

  ? STRING.H 说明一些串操作和内存操作函数。

  ? SYS\STAT.H 定义在打开和创建文件时用到的一些符号常量。

  ? SYS\TYPES.H 说明 ftime 函数和 timeb 结构。

  ? SYS\TIME.H 定义时间的类型 time[ZZ(Z] [ZZ)]t。

  ? TIME.H 定义时间转换子程序 asctime、localtime 和 gmtime 的结构,ctime、

  difftime、 gmtime、 localtime 和 stime 用到的类型,并提供这些函数的原型。

目录
设置
设置
阅读主题
字体风格
雅黑 宋体 楷书 卡通
字体风格
适中 偏大 超大
保存设置
恢复默认
手机
手机阅读
扫码获取链接,使用浏览器打开
书架同步,随时随地,手机阅读
收藏
听书
听书
发声
男声 女生 逍遥 软萌
语速
适中 超快
音量
适中
开始播放
反馈
章节报错
当前章节
报错内容
提交
加入收藏 < 上一章 回到书页 下一章 > 错误反馈

设为首页加入收藏保存桌面网址发布会员中心留言本

Copyright © 2024-2025 All Rights Reserved