บทที่  9  แฟ้มข้อมูลในภาษา  C 
 
บทที่ 1  ความรู้พื้นฐานการเขียน
โปรแกรม
บทที่ 2  ความรู้เบื้องต้นเกี่ยวกับ
โปรแกรมภาษา C
บทที่  3  ฟังก์ชันพื้นฐานการ
เขียนโปรแกรมภาษา  C
บทที่  4  คำสั่งควบคุมการทำงาน
ของโปรแกรม
บทที่  5  ตัวแปรชุดและสตริง 
บทที่  6  พอยน์เตอร์  
บทที่  7  ฟังก์ชันในภาษา  C
บทที่  8  ข้อมูลแบบโครงสร้าง
และยูเนียน
บทที่  9  แฟ้มข้อมูลใน
ภาษา  C
 
  9.1  ความหมายของแฟ้มข้อมูล
       ในภาษา  C
  9.2  ลักษณะโครงสร้างของ
       แฟ้มข้อมูลทั่วไป
  9.3  การประมวลผลแฟ้มข้อมูล
       ในภาษา  C
  9.4  ฟังก์ชันที่ใช้ในการเปิด
       และปิดแฟ้มข้อมูล
  9.5  การใช้ฟังก์ชัน  putc( ) 
       และ  getc(
)
  9.6  การใช้ฟังก์ชัน  fprintf ( ) 
       และ  fscanf( )
  9.7  การใช้ฟังก์ชัน  fwrite( )
       และ  fread( )
 
  9.8  ฟังก์ชันที่ใช้ควบคุมตำแหน่ง
       ของ  file  pointer
 
  9.9 สรุปท้ายบท 
 
 
 

9.7 การใช้ฟังก์ชัน fwrite( )  และ  fread( ) 
            การใช้ฟังก์ชัน fwrite( )  และ  fread( )  ใช้ได้กับ  binary file  เท่านั้น
            9.7.1 ฟังก์ชัน  fwrite( )
            ฟังก์ชัน  fwrite( )  เป็นฟังก์ชันที่ใช้เก็บข้อมูล ลงแฟ้มโดยที่การเก็บข้อมูลแต่ละครั้ง สามารถกำหนดขนาดของข้อมูลที่ต้องการบันทึกได้
รูปแบบการใช้

fwrite(&var, size, n, fp);                         

                        

โดยที่ 


&var  คือ  ตำแหน่งของตัวแปรที่เก็บข้อมูลที่ต้องการนำไปเก็บไว้ในแฟ้ม
size  คือ  ขนาดของข้อมูลที่ต้องการ  write  ลงแฟ้มในแต่ละครั้ง  ซึ่งสามารถหาได้จากฟังก์ชัน  sizeof(data type);  หรือ  sizeof(variable name);  เช่น  sizeof(int);  หรือ  sizeof(j);
n  คือ  จำนวนครั้งที่ต้องการ  write  ข้อมูลลงแฟ้ม
fp  คือ  ตัวชี้ตำแหน่งข้อมูลในแฟ้ม  (file pointer)

ข้อควรจำ   ฟังก์ชัน  fwrite( )  จะให้ค่าเลขจำนวนเต็มเท่ากับ  n  (จำนวนครั้งที่ write ข้อมูลลงแฟ้ม) เมื่อไม่เกิดข้อผิดพลาดในการเขียนข้อมูล  และจะให้ค่าน้อยกว่า n เมื่อมีข้อผิดพลาดเกิดขึ้น            

ตัวอย่างที่  9.6  แสดการใช้ฟังก์ชัน  fwrite( )


เช่น   1)


FILE  *fptr;
double  x=1.2345678912345;
fwrite(&x,sizeof(double x),1,fptr);
เป็นการบันทึกข้อมูลที่เก็บไว้ในตัวแปร  x  ลงแฟ้มข้อมูล  โดยทำการบันทึก  1  ครั้ง  (n=1)  ขนาดของข้อมูลที่บันทึกลงแฟ้มในแต่ละครั้งมีขนาด  8  bytes  ตามชนิดตัวแปร  x


2) 


FILE  *fptr;   int  j;
int a[10]={10,20,30,40,50,60,70,80,90,100};
for (j=0;j<10;j++)
fwrite(&a[j],sizeof(int a[j]),1,fptr);

            เป็นการบันทึกข้อมูลที่เก็บไว้ในตัวแปรชุด  a  ลงแฟ้มข้อมูล  โดยใช้คำสั่ง  for  มาช่วยทำการบันทึกข้อมูลลงแฟ้ม  10  ครั้ง  โดยที่ขนาดของข้อมูลที่บันทึกลงแฟ้มในแต่ละครั้งมีขนาด  2 bytes  ตามชนิดของตัวแปร  a[j]
เพื่อความเข้าใจเกี่ยวกับการใช้ฟังก์ชัน  fwrite( ) มากขึ้น  ให้ศึกษาโปรแกรมตัวอย่างดังต่อไปนี้

โปรแกรมตัวอย่างที่  9.7  แสดงการใช้งานฟังก์ชัน  fwrite( )  เก็บข้อมูลลงแฟ้ม  และสามารถกำหนดขนาดของข้อมูลที่ต้องการบันทึกได้
 
 

 

/*             wdataf3.c              */
/* this program for write student's record  into  data  file */
#include<stdio.h>                                                                      /*  บรรทัดที่  1  */
#include<stdlib.h>                                                                      /*  บรรทัดที่  2  */
#include<conio.h>                                                                     /*  บรรทัดที่  3  */
#include<ctype.h>                                                                     /*  บรรทัดที่  4  */
void main(void)                                                                          /*  บรรทัดที่  5  */
{                                                                                                 /*  บรรทัดที่  6  */
      struct 
            {                                                                                      /*  บรรทัดที่  7  */
                  char name[30];                                                          /*  บรรทัดที่  8  */
                  char id[20];                                                                /*  บรรทัดที่  9  */
                  float gpa;                                                                   /*  บรรทัดที่  10  */
            }student;                                                                          /*  บรรทัดที่  11  */
      char numstr[80], fname[80];                                                      /*  บรรทัดที่  12  */
      FILE *fptr;                                                                                 /*  บรรทัดที่  13  */
      printf("Enter your file name (file format is *.dat) :");                       /*  บรรทัดที่  14  */
      gets(fname);                                                                             /*  บรรทัดที่  15  */
      if( (fptr=fopen(fname, "wb")) == NULL )
            {                                                                                 /*  บรรทัดที่  16  */
                  printf("Error in open file");                                            /*  บรรทัดที่  17  */
                  exit(1);                                                                         /*  บรรทัดที่  18  */
            }                                                                                      /*  บรรทัดที่  19  */
            do
                   {                                                                               /*  บรรทัดที่  20  */
                        clrscr( );                                                               /*  บรรทัดที่  21  */
                        printf("\nEnter student name :");                           /*  บรรทัดที่  22  */
                        gets( student.name );                                            /*  บรรทัดที่  23  */
                       printf("Enter student id :");                                    /*  บรรทัดที่  24  */
                        gets( student.id );                                                 /*  บรรทัดที่  25  */
                        printf("Enter student gpa :");                                /*  บรรทัดที่  26  */
                        gets( numstr );                                                      /*  บรรทัดที่  27  */
                        student.gpa = atof(numstr);                                    /*  บรรทัดที่  28  */
                        fwrite(&student, sizeof(student), 1, fptr);                /*  บรรทัดที่  29  */
                        printf("Add another student(y/n)?:");                 /*  บรรทัดที่  30  */
                  } while( tolower(getche()) == 'y' );                                  /*  บรรทัดที่  31  */
      fclose(fptr);                                                                              /*  บรรทัดที่  32  */
      getch();                                                                                    /*  บรรทัดที่  33  */
}                                                                                                 /*  บรรทัดที่  34  */

 

 
 

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

 

ผลลัพธ์ที่ได้จากโปรแกรม


แผนผังลำดับงาน: จอภาพ: Enter  your  file  name  (file  format  is  *.dat)  :a:student.dat  ทำให้สร้าง  data  file  ในแผ่นดิสก์เก็ตต์ที่อยู่ไดร์ฟ  drive  A  ชื่อแฟ้ม  student.dat  ซึ่งภายในแฟ้ม  student.dat  จะเก็บข้อมูลตามที่เราป้อนผ่านทางคีย์บอร์ดดังนี้    Enter  student  name  :  Janya  Enter  student  id  : 441725101  Enter  student  gpa : 3.00  Add  another  student(y/n)? : y  Enter  student  name : Yod  Enter  student  id : 441725102  Enter  student  gpa : 3.50  Add  another  student (y/n)? : n       


คำแนะนำ  เราค่อยตรวจสอบต่อไปว่าสามารถเขียนข้อมูลลงแฟ้มได้จริงหรือไม่   ในโปรแกรมตัวอย่างที่  9.8

คำอธิบายโปรแกรม

            จากโปรแกรมตัวอย่างที่  9.7  จะให้ผู้ใช้เติมข้อมูลเพื่อเก็บข้อมูลลงในแฟ้มข้อมูล  ซึ่งสามารถเติมข้อมูลได้มากกว่า  1  record  โดยผู้ใช้เป็นคนกำหนดเอง  โดยโปรแกรมจะถามผู้ใช้ว่าจะเติมข้อมูลต่อไปอีกหรือไม่ภายหลังจากเติมข้อมูลแต่ละ  record  แล้ว  ซึ่งถ้าตอบว่าใช่  ก็จะวนให้เติมข้อมูลอีก  แต่ถ้าตอบว่าไม่  ก็จะจบการทำงาน  โดยฟังก์ชันที่ใช้เก็บข้อมูลลงแฟ้ม  คือ  fwrite( )  ในคำสั่งบรรทัดที่  29  และการเก็บข้อมูลจะเก็บไว้ที่ตัวแปร  struct  ซึ่งได้ประกาศไว้ในบรรทัดที่  6

 

            9.7.2 ฟังก์ชัน  fread( )
                        ฟังก์ชัน  fread( )  เป็นฟังก์ชันที่ใช้อ่านข้อมูลจากแฟ้ม  โดยที่แต่ละครั้งสามารถกำหนดขนาด  (size)  ของข้อมูลที่ต้องการอ่านได้

          รูปแบบการใช

fread(&var,size,n,fp);

  

โดยที่ 


&var  คือ  ตำแหน่งของตัวแปรที่เก็บข้อมูลที่ต้องการนำไปเก็บไว้ในแฟ้ม
size  คือ  ขนาดของข้อมูลที่ต้องการ  read  ขึ้นจากแฟ้มในแต่ละครั้ง  ซึ่งสามารถหาได้จากฟังก์ชัน  sizeof(data type);  หรือ  sizeof(variable name);  เช่น  sizeof(int);  หรือ  sizeof(j);
n  คือ  จำนวนครั้งที่ต้องการ  read  ข้อจากแฟ้ม
fp  คือ  ตัวชี้ตำแหน่งข้อมูลในแฟ้ม  (file pointer)

ข้อควรจำ  ฟังก์ชัน  fread( )  จะให้ค่าตัวเลขจำนวนเต็ม  =  n  เมื่อไม่เกิดข้อผิดพลาดในการอ่านข้อมูล  และจะให้ค่าเป็นศูนย์  (0 หรือ NULL)  เมื่อมีข้อผิดพลาดในการอ่านข้อมูลจากแฟ้มหรือสิ้นสุดไฟล์  (EOF)

  

ตัวอย่างที่  9.7  แสดงการใช้ฟังก์ชัน  fread( )


เช่น  1)


FILE  *fptr;
double x;
fread(&x,sizeof(double x),1,fptr);
เป็นการอ่านข้อมูลในแฟ้มข้อมูลมาเก็บไว้ที่ตัวแปร  x  โดยทำการอ่านข้อมูล  1  ครั้ง  (n=1)  ขนาดของข้อมูลที่อ่านจากแฟ้มในแต่ละครั้งมีขนาด  8  bytes  ตามชนิดตัวแปร  x


2)


FILE  *fptr;
int a[10]; int  j;
for (j=0;j<10;j++)
fread(&a[ j],sizeof(int a[ j]),1,fptr);

            เป็นการอ่านข้อมูลในแฟ้มมาเก็บไว้ในตัวแปรชุด  a  โดยทำการอ่านข้อมูล  10  ครั้ง  โดยที่ขนาดของข้อมูลที่อ่านจากแฟ้มในแต่ละครั้งมีขนาด  2  bytes  ตามชนิดตัวแปร  a[j]
เพื่อความเข้าใจเกี่ยวกับการใช้ฟังก์ชัน   fread( )   มากขึ้น  ให้ศึกษาโปรแกรม ตัวอย่างดังต่อไปนี้

โปรแกรมตัวอย่างที่  9.8  แสดงการใช้งานฟังก์ชัน  fread( )  อ่านข้อมูลจากแฟ้มโดยแต่ละครั้งสามารถกำหนดขนาดข้อมูลที่ต้องการอ่านได้
 
 

 

/*             rdataf3.c                */
/* this program for read student's record from data file */

#include<stdio.h>                                                                       /*  บรรทัดที่  1  */
#include<conio.h>                                                                      /*  บรรทัดที่  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  */
      char  fname[80];                                                                          /*  บรรทัดที่  11  */
      FILE *fptr;  clrscr();                                                                      /*  บรรทัดที่  12  */
      printf("Enter your file name (file format is *.dat) :");                       /*  บรรทัดที่  13  */
      gets(fname);                                                                              /*  บรรทัดที่  14  */
      if( (fptr=fopen(fname, "rb")) == NULL )  
            {                                                                                  /*  บรรทัดที่  15  */
                  printf("Error in open file");                                            /*  บรรทัดที่  16  */
                  exit(1);                                                                             /*  บรรทัดที่  17  */
            }                                                                                       /*  บรรทัดที่  18  */
            while( fread(&student, sizeof(student),1, fptr) == 1 )          /*  บรรทัดที่  19  */
      {                                                                                                 /*  บรรทัดที่  20  */
            printf("\nName = %s\n", student.name);                         /*  บรรทัดที่  21  */
            printf("Id = %s\n", student.id);                                           /*  บรรทัดที่  22  */
            printf("GPA = %.2f\n", student.gpa);                                /*  บรรทัดที่  23  */
      }                                                                                            /*  บรรทัดที่  24  */
            fclose(fptr);                                                                        /*  บรรทัดที่  25  */
            getch();                                                                             /*  บรรทัดที่  26  */
      }/* end main */                                                                        /*  บรรทัดที่  27  */

 

 
 


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

ผลลัพธ์ที่ได้จากโปรแกรม


แผนผังลำดับงาน: จอภาพ: Enter  your  file  name  (file  format  is  *.dat) : a:student.dat  ทำให้เปิด  data  file  ในแผ่นดิสก์เก็ตต์ทีอยู่ในไดร์ฟ   A:  ชื่อแฟ้ม  student.dat  และพิมพ์ข้อมูลออกทางจอภาพ  ตามข้อมูลในแฟ้ม  student.dat  ดังนี้    Name  =  Janya  Id  =  441725101  GPA  =  3.00   Name  =  Yod  Id = 441725102  GPA  =  3.50

คำอธิบายโปรแกรม
จากโปรแกรมตัวอย่างที่  9.8  โปรแกรมจะอ่านข้อมูลในแฟ้มที่เราบันทึกไว้ในโปรแกรมตัวอย่างที่  9.7  ที่  drive  a:  ชื่อ  student.dat  แล้วนำข้อมูลทั้งหมดแสดงออกที่จอภาพ

 
งานพัฒนาและบริการสื่ออิเล็กทรอนิกส์   มหาวิทยาลัยราชภัฏสกลนคร
680 ม. 11 ถ.นิตโย ต.ธาตเชิงชุม อ.เมือง จ.สกลนคร รหัสไปรษณีย์ 47000 โทรศัพท์ 0-4271-1375 โทรสาร 0-4271-3063
Copyright ? 2006 Sakon Nakhon Rajabhat University. All rights reserved.