【C语法学习】20 - 文件访问顺序

0 前言

C语言文件访问分为顺序文件访问和随机文件访问。

1 文件位置指示符

关于文件位置指示符:

  1. 每个打开的文件都有一个相关联的文件位置指示符;
  2. 文件位置指示符指明在文件中进行读写操作的位置;
  3. 位置以偏离文件开头(第一个字节)的字节数表示,文件开头的位置为0;
  4. 以a、ab、a+、ab+模式打开现有文件时,文件位置指示符位于文件末尾;
  5. 以r、rb、w、wb、r+、rb+、w+、wb+模式打开现有文件时,文件位置指示符位于文件开头;
  6. 文件读写操作发生在位置指示符所标注的位置,并更新位置指示符。

2 rewind()函数

2.1 函数原型

rewind():把文件位置指示符设置至文件开头,函数原型如下:

void rewind(FILE *stream);

2.2 参数

rewind()函数只有一个参数stream:

  1. 参数stream是一个指向FILE类型结构的指针(fopen()函数的返回值)。

2.3 返回值

rewind()函数的返回值为空void。

2.4 使用说明

在不关闭文件的情况下,调用rewind()函数后,文件的位置指示符被设置到文件的开头0字节处;此时,可以从文件开头处开始,重新读取文件数据。

3 ftell()函数

3.1 函数原型

ftell():获取文件位置指示符的当前位置,函数原型如下:

long int ftell(FILE *stream);

3.2 参数

ftell()函数只有一个参数stream:

  1. 参数stream是一个指向FILE类型结构的指针(fopen()函数的返回值)。

3.3 返回值

ftell()函数返回值类型为long型:

  1. 获取成功,返回文件位置指示符的当前位置,指出当前读写位置偏离文件开头多少字节;
  2. 获取失败,返回-1L。

C语言标准描述如下:

1. File position indicator on success or -1L if failure occurs.

4 fseek()函数

4.1 函数原型

fseek():设置文件位置指示符的位置,函数原型如下:

int fseek(FILE *stream, long offset, int origin);

4.2 参数

fseek()函数有三个参数:

  1. 参数stream:指向FILE类型结构的指针(fopen()函数的返回值);
  2. 参数offset:文件位置指示符相对起始位置origin的偏移量,以字节为单位,类型为long型;offset为正时,向后移动;offset为负时,向前移动;
  3. 参数origin:文件位置指示符偏移量offset的起始位置,类型为int型。

origin有三种取值,如下图所示:

在这里插入图片描述

4.3 返回值

fseek()函数的返回值为int型:

  1. 设置成功,返回0;
  2. 设置失败,返回非0值。

C语言标准描述如下:

1. If successful, fseek returns 0. 
2. Otherwise, it returns a nonzero value. 

5 示例

5.1 示例1

验证rewind函数是否将文件位置指示符设置至文件开头,示例代码如下所示:

#define BUFLEN 6
int main()
{
   //
   char msg[] = "abcdefghijklmnopqrstuvwxyz";
   FILE* fp;
   char buf[BUFLEN] = { 0 };
   //
   if ((fp = fopen("1.txt", "w")) == NULL)
   {
      printf("Failed to open file.\n");
      exit(1);
   }
   //
   if ((fputs(msg, fp)) == EOF)
   {
      printf("Failed to write file.\n");
      exit(1);
   }
   //
   fclose(fp);
   //
   if ((fp = fopen("1.txt", "r")) == NULL)
   {
      printf("Failed to open file.\n");
      exit(1);
   }
   printf("After open file, position = %ld\n", ftell(fp));
   //
   fgets(buf, BUFLEN, fp);
   printf("After read sting %s, position = %ld\n", buf, ftell(fp));
   //
   fgets(buf, BUFLEN, fp);
   printf("After read sting %s, position = %ld\n", buf, ftell(fp));
   //
   rewind(fp);
   printf("After rewind, position = %ld\n", ftell(fp));
   //
   fgets(buf, BUFLEN, fp);
   printf("After read sting %s, position = %ld\n", buf, ftell(fp));
   //
   fclose(fp);

   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

5.2 示例2

使用fseek()函数设置文件位置指示符,示例代码如下所示:

#define MAX 50

int main()
{
   //变量定义
   FILE* fp;
   int data = 0;
   int count = 0;
   int arr[MAX] = { 0 };
   long offset;
   int  dir = 0;
   //初始化数组
   for (count = 0; count < MAX; count++)
   {
      arr[count] = count * 10;
   }
   //打开文件
   if ((fp = fopen("1.dat", "wb")) == NULL)
   {
      printf("Failed to open file.\n");
      exit(1);
   }
   //写文件
   if ((fwrite(arr, sizeof(int), MAX, fp)) != MAX)
   {
      printf("Failed to write file.\n");
      exit(1);
   }
   //关闭文件
   fclose(fp);
   //打开文件
   if ((fp = fopen("1.dat", "rb")) == NULL)
   {
      printf("Failed to open file.\n");
      exit(1);
   }
   //读文件
   while (1)
   {
      //
      printf("请输入读取方向(1-正向,2-反向):>\n");
      scanf("%d", &dir);
      
      if (dir != 1 && dir != 2)
      {
         continue;
      }
      //
      printf("请输入数组元素的下标:>\n");
      scanf("%ld", &offset);
      
      if (offset < 0)
      {
         break;
      }
      else if(offset > MAX - 1)
      {
         continue;
      }
      //
      if (dir == 1)
      {
         if ((fseek(fp, (offset * sizeof(int)), SEEK_SET)) != 0)
         {
            printf("Failed to use fseek().\n");
            exit(1);
         }
      }
      else if (dir == 2)
      {
         if ((fseek(fp, (-offset * sizeof(int)), SEEK_END)) != 0)
         {
            printf("Failed to use fseek().\n");
            exit(1);
         }
      }
      //
      fread(&data, sizeof(int), 1, fp);
      //
      printf("arr[%ld] = %d\n", offset, data);
   }
   //关闭文件
   fclose(fp);

   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言程序设计复习资料主要包括基础知识、语法规则、数据类型、控制结构、函数、数组、指针、字符串、结构体、文件操作等内容。 首先,基础知识是C语言程序设计的基础,包括C语言的起源、发展历程、特点等。了解这些可以更好地理解C语言的设计思想和使用方法。 其次,掌握C语言的语法规则非常重要。包括标识符命名规则、注释的使用、变量和常量的定义及使用、运算符、表达式和语句等。熟悉这些规则可以编写正确的C语言程序。 再者,掌握C语言的数据类型是编程的基础。包括整型、浮点型、字符型等基本数据类型,以及数组、结构体、联合等复合数据类型。了解它们的特点和使用方法可以更灵活地处理数据。 除此之外,掌握C语言的控制结构也是非常重要的。包括顺序结构、分支结构和循环结构。掌握这些结构可以编写出具有逻辑性的程序。 另外,函数是C语言的一个重要组成部分。掌握函数的定义、声明、调用和返回值的处理可以提高程序的模块化和可读性。 此外,数组和指针是C语言中常用的数据结构。熟悉数组的定义、初始化和元素访问以及指针的定义、赋值和操作可以更方便地处理各种数据。 同时,字符串的处理在实际编程中也非常常见。包括字符串的定义、初始化、比较、拼接以及与字符数组之间的相互转换等。 最后,了解文件操作是C语言程序设计中必备的技能。包括文件的打开、关闭、读取和写入等。掌握文件操作可以实现程序与外部文件之间的数据交互。 总之,C语言程序设计复习资料应该包括以上内容,通过学习和练习这些知识,可以帮助我们更好地掌握C语言,提高编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值