วันพุธที่ 17 กันยายน พ.ศ. 2557

07:04
9.8 ฟังก์ชันที่ใช้ควบคุมตำแหน่งของ  file pointer  ในแฟ้มข้อมูล
            การควบคุมตำแหน่งของ  fp  (file pointer)  ในแฟ้มข้อมูล  นิยมใช้กันมากในการประมวลผลแฟ้มข้อมูลแบบสุ่ม  (random file access)  ซึ่งสามารถให้  fp  ไปยังตำแหน่งเริ่มต้นของแฟ้มข้อมูล  (BOF =beginning of file) หรือ  ตำแหน่งใดตำแหน่งหนึ่งในแฟ้มข้อมูลได้
            ฟังก์ชันที่ใช้ควบคุมตำแหน่ง  file pointer  มีดังนี้
            9.8.1 ฟังก์ชัน  rewind( )
                        เป็นฟังก์ชันที่ใช้ย้ายตำแหน่งของ  file pointer  ไปยังตำแหน่งเริ่มต้นของแฟ้ม
รูปแบบการใช้
rewind(fp);
  
           
            9.8.2 ฟังก์ชัน  fseek( )
            เป็นฟังก์ชันที่ใช้ย้ายตำแหน่งของ  file pointer  ไปยังตำแหน่งที่ต้องการในแฟ้มข้อมูลโดยจะต้องกำหนดจุดเริ่มต้น  (origin)  ของ  file pointer  และค่า  offset
รูปแบบการใช้ 
fseek(fp, offset, origin);
  
โดยที่ 

offset  คือ  ระยะห่างจากตำแหน่งจุดเริ่มต้น มีหน่วยเป็น  byte
origin  คือ  จุดที่  file pointer  ชี้อยู่  มีอยู่  3  สถานะ  ดังนี้คือ
                                  macro-name       ค่าคงที่            ความหมาย
                                    SEEK_SET             0           file pointer อยู่ที่ต้นแฟ้ม  BOF
                                    SEEK_CUR            1           file pointer  อยู่ที่ตำแหน่งปัจจุบัน
                                    SEEK_END            2           file pointer  อยู่ที่ท้ายไฟล์  EOF
ตัวอย่างที่  9.8  แสดการใช้งาน  fseek(fptr,10,0);

หรือคำสั่ง   fseek(fptr,10, SEEK_SET);
หมายความว่าให้ย้าย  file pointer  ถัดจากตำแหน่งต้นไฟล์  (BOF)  ไปอีก  10  byte
ข้อควรจำ  ฟังก์ชัน fseek( ) จะให้ค่าไม่เท่ากับศูนย์  เมื่อไม่สามารถย้าย  file pointer  ได้
            9.8.3 ฟังก์ชัน  ftell( )
                        เป็นฟังก์ชันที่ใช้บอกตำแหน่งของ  file pointer  ว่าปัจจุบันกำลังชี้อยู่ที่ตำแหน่งใดในแฟ้มข้อมูล  โดยฟังก์ชันนี้จะให้ค่ากลับเป็นตัวเลขจำนวนเต็ม
รูปแบบการใช้ 
ftell( fp );
  
ตัวอย่างที่  9.9  แสดงการใช้งาน  int position;

position = ftell(fp);
printf(“Position is %d Byte”,position);
            เพื่อความเข้าใจเกี่ยวกับการใช้ฟังก์ชัน  fseek( )  มาช่วยในการประมวลผลแฟ้มข้อมูลแบบสุ่มมากยิ่งขึ้น  ให้ศึกษาจากโปรแกรมตัวอย่างต่อไปนี้
โปรแกรมตัวอย่างที่ 9.9 แสดงการใช้ฟังก์ชัน fseek( ) ช่วยประมวลผลแฟ้มข้อมูลแบบสุ่ม

/*             randacss.c           */
/* this program for read one student' s record  from  data file */
#include<stdio.h>                              /* FILE, NULL ,etc  in this file */ /*  บรรทัดที่  1  */
#include<conio.h>                             /* clrscr() in this file */       /*  บรรทัดที่  2  */
#include<stdlib.h>                                                                       /*  บรรทัดที่  3  */
void main(void)                                                                             /*  บรรทัดที่  4  */
{                                                                                                     /*  บรรทัดที่  5  */
      struct  {                                                                                           /*  บรรทัดที่  6  */
            char name[30];                                                                    /*  บรรทัดที่  7  */
            char id[20];                                                                           /*  บรรทัดที่  8  */
            float gpa;                                                                               /*  บรรทัดที่  9  */
      } student;                                                                                   /*  บรรทัดที่  10  */
      FILE *fptr;                                                                                  /*  บรรทัดที่  11  */
      int recno;                         /* record number */                   /*  บรรทัดที่  12  */
      long int offset;                  /* offset must be long */            /*  บรรทัดที่  13  */
      if( (fptr=fopen("a:student.dat", "rb")) == NULL ) {                          /*  บรรทัดที่  14  */
            printf("Can't open file ");                                                     /*  บรรทัดที่  15  */
            exit(1);                                                                                    /*  บรรทัดที่  16  */
      }                                                                                                /*  บรรทัดที่  17  */
      clrscr();                                                                                       /*  บรรทัดที่  18  */
      printf("Enter record number :");  /* get record num */                  /*  บรรทัดที่  19  */
      scanf("%d", &recno);                                                                  /*  บรรทัดที่  20  */
      offset = (recno-1)*sizeof(student);                   /* find offset */       /*  บรรทัดที่  21  */
      if( fseek(fptr, offset, 0) != 0 )               /* go there */                  /*  บรรทัดที่  22  */
            {
                   printf("Can't move file pointer");                                        /*  บรรทัดที่  23  */
                  exit(1);                                                                              /*  บรรทัดที่  24  */
            }                                                                                                  /*  บรรทัดที่  25  */
      fread( &student, sizeof(student), 1, fptr );                                       /*  บรรทัดที่  26  */
      printf("\nName = %s\n", student.name);                                    /*  บรรทัดที่  27  */
      printf("Id = %s\n", student.id);                                                    /*  บรรทัดที่  28  */
      printf("GPA = %.2f\n", student.gpa);                                           /*  บรรทัดที่  29  */
      fclose(fptr);                                                                                    /*  บรรทัดที่  30  */
      getch();                                                                                         /*  บรรทัดที่  31  */
} /* end main */                                                                               /*  บรรทัดที่  32  */

  
หมายเหตุ  ก่อน  run  โปรแกรมต้องใส่แผ่นดิสก์เก็ตต์ไว้ในไดร์ฟ  a:  ที่มีแฟ้ม  student.dat  ที่เคยสร้างไว้แล้ว  เพื่อให้โปรแกรมอ่านข้อมูลจากแฟ้มนี้
ผลลัพธ์ที่ได้จากโปรแกรม

แผนผังลำดับงาน: จอภาพ: Enter  record  number  :  2 <enter>  Name  =  Yod  Id  =  441725102  GPA  =  3.50
คำอธิบายโปรแกรม 
            จากโปรแกรมตัวอย่างที่  9.9  โปรแกรมจะอ่านข้อมูลในเรคอร์ดที่  2  จากแฟ้มข้อมูลที่  drive  a:  ชื่อ  student.dat  ได้เลย  โดยที่เราไม่ต้องอ่านเรคอร์ดที่  1  ก่อน

0 ความคิดเห็น:

แสดงความคิดเห็น