C-文件处理-随机访问文件

时间:2020-02-23 14:31:54  来源:igfitidea点击:

在本教程中,我们将学习使用C编程语言随机访问文件数据。

在本教程中,我们将讨论fseek(),ftell()和rewind()函数以访问文件中的数据。

ftell函数

ftell()函数告诉我们文件中的当前位置(以字节为单位)。

语法:

pos = ftell(fptr);

其中," fptr"是文件指针。
pos保持当前位置,即读取(或者写入)的总字节数。

例:

如果一个文件有10个字节的数据,并且ftell()函数返回4,则意味着已经读取(或者写入)了4个字节。

rewind函数

我们使用rewind()函数返回文件的起点。

语法:

rewind(fptr);

其中," fptr"是文件指针。

fseek函数

我们使用fseek()函数将文件位置移动到所需位置。

语法:

fseek(fptr, offset, position);

其中," fptr"是文件指针。
类型为long的偏移量,指定要从位置指定的位置在文件中移动的位置数(以字节为单位)。

" position"可以采用以下值。

  • 0-文件的开头
  • 1-文件中的当前位置
  • 2-文件结尾

以下是我们可以使用fseek()函数执行的操作列表。

操作说明
fseek(fptr,0,0)这会将我们带到文件的开头。
fseek(fptr,0,2)这将带我们到文件末尾。
fseek(fptr,N,0)将带我们到文件中第(N +1)个字节。
fseek(fptr,N,1)这将使我们从文件中的当前位置开始向前N个字节。
fseek(fptr,-N,1)这将使我们从文件中的当前位置向后N个字节。
fseek(fptr,-N,2)这将使我们从文件的末尾向后N个字节。

用C编写一个程序以将字母A保存到文件Z,然后使用fseek函数打印字母

#include <stdio.h>

int main(void) {
    
  //integer variable
  int i;
    
  //character variable
  char ch;
  
  //file pointer
  FILE *fptr;
  
  //open file in write mode
  fptr = fopen("char", "w");
  
  if (fptr != NULL) {
    printf("File created successfully!\n");
  }
  else {
    printf("Failed to create the file.\n");
    //exit status for OS that an error occured
    return -1;
  }
  
  //write data in file
  for (ch = 'A'; ch <= 'Z'; ch++) {
    putc(ch, fptr);
  }
  
  //close connection
  fclose(fptr);
  
  //reference
  printf("\nReference:\n");
  for (i = 0; i < 26; i++) {
    printf("%d ", (i+1));
  }
  printf("\n");
  for (i = 65; i <= 90; i++) {
    //print character
    printf("%c", (i));
    
    //manage space
    if (i - 65 >= 9) {
      printf("  ");
    }
    else {
      printf(" ");
    }
  }
  printf("\n\n");
  
  
  //open file for reading
  fptr = fopen("char", "r");
  
  printf("Curr pos: %ld\n", ftell(fptr));
  
  //read 1st char in the file
  fseek(fptr, 0, 0);
  ch = getc(fptr);
  printf("1st char: %c\n", ch);
  
  printf("Curr pos: %ld\n", ftell(fptr));
  
  //read 5th char in the file
  fseek(fptr, 4, 0);
  ch = getc(fptr);
  printf("5th char: %c\n", ch);
  
  printf("Curr pos: %ld\n", ftell(fptr));
  
  //read 26th char in the file
  fseek(fptr, 25, 0);
  ch = getc(fptr);
  printf("26th char: %c\n", ch);
  
  printf("Curr pos: %ld\n", ftell(fptr));
  
  //rewind
  printf("rewind\n");
  rewind(fptr);
  
  printf("Curr pos: %ld\n", ftell(fptr));
  
  //read 10th char in the file
  fseek(fptr, 9, 0);
  ch = getc(fptr);
  printf("10th char: %c\n", ch);
  
  printf("Curr pos: %ld\n", ftell(fptr));
  
  //read 15th char in the file
  fseek(fptr, 4, 1);    //move 4 bytes forward from current position
  ch = getc(fptr);
  printf("15th char: %c\n", ch);
  
  printf("Curr pos: %ld\n", ftell(fptr));
  
  //read 20th char in the file
  fseek(fptr, 4, 1);    //move 4 bytes forward from current position
  ch = getc(fptr);
  printf("20th char: %c\n", ch);
  
  printf("Curr pos: %ld\n", ftell(fptr));
  
  //close connection
  fclose(fptr);
  
  return 0;
}
File created successfully!

Reference:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 
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  

Curr pos: 0
1st char: A
Curr pos: 1
5th char: E
Curr pos: 5
26th char: Z
Curr pos: 26
rewind
Curr pos: 0
10th char: J
Curr pos: 10
15th char: O
Curr pos: 15
20th char: T
Curr pos: 20