บทที่12
ไฟล์
ไฟล์(File)คือ  ที่เก็บข้อมูลต่าง ๆ ของคอมพิวเตอร์ และในภาษา C นั้นไฟล์ก็จะมีความหมายรวมไปถึงอุปกรณ์ต่างที่ต่อกับเครื่องคอมพิวเตอร์ด้วย เข่น คีย์บอร์ด จอภาพ
การติดต่อกับไฟล์จะต้องผ่านลิจิกคอลอินเตอร์เฟส (Logical Interfaces) ที่เรียกว่าสตรีม (Stream) สตรีมจะช่วยให้ผู้ใช้เขียนโปรแกรมติดต่อกับอุปกรณ์ต่าง ๆ ได้ ซึ่งสตรีมที่ใช้ติดต่อกับไฟล์  ไฟล์จะมีอยู่  2  ประเภทคือ
Text file  เป็นไฟล์ของตัวอักษร เพราะมีโครงสร้างในการเก็บข้อมูลจะเป็นตัวอักษรไฟล์นั้นจึงไม่สามารถที่จะเก็บข้อมูลที่ค่าตัวเลขจำนวนเต็ม  จุดทศนิยม หรือในลักษณะที่เป็นโครงสร้างซึ่งการเก็บ ข้อมูลจะถูกแปลงเป็นเลขฐานสองตามรหัส ASDII
Binary File  เป็นไฟล์ที่เก็บข้อมูลที่อยู่ในรูปแบบของค่าตรง ๆ ซึ่งข้อมูลที่ไฟล์ประเภทนี้จัดเก็บ จะสามารถเป็นได้ทั้งตัวเลขจำนวนเต็ม ตัวเลขทศนิยม ตัวอักษร อาร์เรย์ และข้อมูลแบบโครงสร้าง โดยการจัดเก็บนั้นจะเก็บลงไปตรง ๆ เลย
File Table  ก่อนที่ใช้ไฟล์ได้ผู้ใช้จะต้องรู้จักกับ File  Table  ซึ่ง  File  Table  คือ  ส่วนของหน่วยความจำที่เก็บข้อมูลต่าง ๆที่เกี่ยวกับไฟล์
Text  File  ฟังก์ชันที่เกี่ยวกับไฟล์นั่นจะใช้ไลบรารีไฟล์   stdio.h  ซึ่งเป็นไลบารีไฟล์มาตรฐานที่ต้องใช้อยู่เสมอ จึงไม่จำเป็นต้องนำเข้าไลบรารีไฟล์อื่นๆ อีก
การเปิดไฟล์   ฟังก์ชั่นในการเปิดไฟล์  คือ  ฟังก์ชัน  fopen  ฟังก์ชันนี้ต้องการพารามิเตอร์ 2ตัว ตัวแรกคือชื่อไฟล์ที่ต้องการจะเปิด  ซึ่งอาจจะรวมที่อยู่ของไฟล์  (Path)  ในกรณีที่ไฟล์ที่ต้องการใช้ไม่ได้อยู่ที่เดียวกันกับไฟล์โปรแกรม และตัวที่ 2 จะเป็นโหมดในการเปิดซึ่งจะมีโหมดการเปิดอยู่ 3โหมดดังที่แสดง

โหมด

ความหมาย

r

เปิดไฟล์ขึ้นมาเพื่ออ่าน
-     ถ้าเปิดสำเร็จ ไฟล์พอยเตอร์จะชี้ไปที่ต้นไฟล์
-     ถ้าเปิดไม่ได้ จะส่งค่ากลับเป็นค่า  Error (Null)

w

เปิดไฟล์ขึ้นมาเพื่อเขียน

  1. ถ้าเปิดสำเร็จ จะได้ไฟล์ว่าง ๆ
  2. ถ้าเปิดไม่ได้ จะสร้างไฟล์ที่ต้องการให้ใหม่

a

เปิดไฟล์ขึ้นมาเพื่อเขียนต่อ

  1. ถ้าเปิดสำเร็จ ไฟล์พอยเตอร์จะชี้ไปที่ปลายไฟล์
  2. ถ้าเปิดไม่ได้ จะสร้างไฟล์ที่ต้องการให้ใหม่

                ชื่อไฟล์ คือ สตริงที่เป็นชื่อของไฟล์  ซึ่งอาจจะรวมกับที่อยู่ของไฟล์  (Pull)  ด้วย ซึ่งไฟล์ที่ใช้จะนามสกุล  .dat
การปิดไฟล์   เมื่อเปิดใช้ไฟล์แล้วใช้เสร็จ  ก็ควรจะทำการปิดไฟล์ที่ใช้ด้วย  ซึ่งฟังก์ชันที่ใช้ปิดไฟล์  คือ ฟังก์ชัน  fclose   ซึ่งมีรูปแบดังนี้
Fclose   ( [ ชื่อไฟล์พอยเตอร์ ] );
ในการเปิดไฟล์และปิดไฟล์นั้นอาจจะเกิดการผิดพลาดขึ้นได้  จนทำให้การเปิดและปิดไฟล์ไม่สมบรูณ์ ถ้าเปิดไฟล์ไม่สำเร็จ ฟังก์ชั่น  fopen  จะส่งค่ากลับมาเป็นค่า   Null  และถ้าการปิดไฟล์ไม่สำเร็จจะส่งค่ากลับเป็น  EOF  ซึ่งจากตรงนี้ทำให้สามารถเขียนโปรแกรมเพื่อตรวจสอบการเปิดและปิดไฟล์ เพื่อป้องกันไม่ให้การทำงานของโปรแกรมผิดพลาด  ดังแสดงในโปรแกรม 12-1

 

                การอ่านและเขียนไฟล์
ฟังก์ชันในอ่านและเขียนไฟล์นั้น  คือ  ฟังก์ชัน fscanf และ fprintf  ตามลำดับ  fscanf  เป็นฟังก์ชันในการอ่านข้อมูลจากไฟล์  ซึ่งการทำงานก็เหมือนกับฟังก์ชัน  scan    แต่จะต่างกันตรงที่ฟังก์ชัน   fscanf  จะต้องใช้ไฟล์พอยเตอร์เพื่อชี้ตำแหน่งที่จะอ่านจากไฟล์มีรูปแบบดังนี้
Fscanf  ( [ชื่อไฟล์พอยเตอร์ ] , “[ รูปแบบข้อความ ]” , [ที่อยู่ของตัวแปร]);
ในการอ่านข้อมูลนั้น  ผู้ใช้ต้องรู้อยู่แล้วว่าข้อมูลที่จะไปอ่าน เก็บอยู่ในลักษณะอย่างไรแล้วจึงเขียนรูปแบบข้อความตามนั้น  เช่น
5-10-1936
ชุดคำสั่งการอ่านจะเป็นดังนี้
fscanf( fpData, “%d-%d-%d”,  &month, &day, &year);
Fprintf  เป็นฟังก์ชันในการเขียนข้อมูลลงไปในไฟล์  ซึ่งการทำงานก็เหมือนกับฟังก์ชัน  printf แต่จะใช้ไฟล์พอยเตอร์เป็นตัวชี้ตำแหน่งของไฟล์ที่จะเขียนข้อมูลลงไป  เช่น
fprintf (fpOurt , “%d\n%d\n%d”, i , j , k);
เมื่อคำสั่งนี้ทำงานค่าที่เก็บในไฟล์จะเป็นดังนี้
100
200
300

โปรแกรมตรวจสอบการเปิดและปิดไฟล์ที่ 12-1

โปรแกรมการอ่านข้อมูล  12-2


โปรแกรมการคัดลอกข้อมูล  12-3

โปรแกรมเขียนข้อมูลลงไฟล์  12-4


ฟังก์ชันการอ่านและเขียนข้อมูลที่เป็นตัวอักษร

                Getc  และ  fgetc  ทั้งสองฟังก์ชันนี้จะมีการทำงาน คือ  จะอ่านตัวอักษรตัวต่อไปจากไฟล์ขึ้นมาเลย  และถ้าอ่านไปจนจบไฟล์  ทั้งสองก็จะส่งค่ากลับเป็น  EOF  ซึ่งตัวอย่างในการใช้ได้แสดงหน้าถัดไป
nextChar  =  getc(fpMyFile);
nextChar  =  fgetc(fpMyFile);
putc  และ  fputtc  ทั้งสองฟังก์ชันนี้จะมีการทำงาน  คือ  จะเขียนข้อมูลลงไปในไฟล์ที่ละ 1 ตัวอักษร ถ้าการเขียนข้อมูลสมบรูณ์จะส่งค่ากลับมาเป็นตัวอักษรที่ส่งไป  แต่ถ้าไม่สมบรูณ์จะส่งค่ากลับเป็น  EOF  ซึ่งตัวอย่างการใช้ทั่งสองฟังก์ชัน
putc(oneChar , fpMyFile);
fputc (oneChar , fpMyFile);

โปรแกรมสร้าง  Text  File   12-5



Binary  File                 เมื่อสังเกตดี  ๆ  จะมีเก็บข้อมูลเหมือนการเก็บข้อมูลเป็นเรคคอร์ด  ซึ่งทำให้การอ่าน-เขียนนั้นกระทำได้ค่อนข้างที่จะง่ายกว่า  Text  File  
การเปิดไฟล์และปิดไฟล์
ในการเปิดปิดไฟล์  Binary  File  นั้นจะเหมือนกับ  Text  File   เลยแต่สิ่งที่ต่างกันจะอยู่ตรงที่โหมดในการเปิดไฟล์  ซึ่งโหมดในการเปิด  Binary  File 

โหมด

ความหมาย

rb

เปิดไฟล์ขึ้นมาเพื่ออ่าน

  1. ถ้าเปิดสำเร็จ ไฟล์พอยเตอร์จะชี้ไปที่ต้นไฟล์
  2. ถ้าเปิดไม่ได้  จะส่งค่ากลับเป็นค่า  Error (NuII)

wb

เปิดไฟล์ขึ้นมาเพื่อเขียน

  1. ถ้าเปิดสำเร็จ  จะได้ไฟล์ว่าง ๆ
  2. ถ้าเปิดไม่ได้ จะสร้างไฟล์ที่ต้องการให้ใหม่

ab

เปิดไฟล์ขึ้นมาเพื่อเขียนต่อ

  1. ถ้าเปิดสำเร็จ ไฟล์พอยเตอร์จะชี้ไปที่ปลายไฟล์
  2. ถ้าเปิดไม่ได้ จะสร้างไฟล์ที่ต้องการให้ใหม่

                การอ่านและเขียนไฟล์
ฟังก์ชันในการอ่านและเขียนไฟล์นั้น  คือ  ฟังก์ชัน fread   และ  fwrite  ตามลำดับ
fread    เป็นฟังก์ชันในการอ่านข้อมูลจากไฟล์  รูปแบบดังนี้
fread([ ชื่อตัวแปร] , [ขนาดของตัวแปร] , [ จำนวน ] , [ชื่อไฟล์พอยเตอร์]);
ในการอ่านข้อมูลจาก  Binary  File  จะต้องกำหนดขนาดของข้อมูลและจำนวนที่อ่านขึ้นมาเพราะอย่างที่ได้กล่าวไปในข้างต้นแล้ว Binary  File   จะเก็บข้อมูลในลักษณะรูปแบบทางคอมพิวเตอร์เพราะฉะนั้นผู้ใช้จะต้องการอ่านข้อมูลที่ตัวเลขจำนวนเต็ม  1  ตัว ซึ่งตัวเลขจำนวนเต็มจะใช้พื้นที่ 2 ไบต์และขนาดที่กำหนดคือ 2 เพื่อให้การอ่านข้อมูลแล้วสามารถเก็บในตัวแปรได้ถูกต้อง

 

 

 

โปรแกรมการอ่านข้อมูลจากไฟล์ 12-6

โปรแกรมการอ่านข้อมูลแบบโครงสร้าง 12-7


fwrite  เป็นฟังก์ชันในการเขียนข้อมูลลงไฟล์  มีรูปดังนี้
fwrite([ชื่อตัวแปร] , [ขนาดของตัวแปร] , [จำนวน] , [ชื่อไฟล์พอยเตอร์]);
ฟังก์ชันนี้จะคล้ายกับฟังก์ชัน  fread  แต่ทำเป็นการเขียนแทน โดยสิ่งที่ต้องการก็เหมือนกัน  แสดงในตัวอย่าง
fwrite(num , sixeof (int), 1, fpData);

โปรแกรมในการเขียนข้อมูลแบบโครงสร้าง 12-8

ฟังก์ชันบอกสถานะของไฟล์
Feof   เป็นฟังก์ชันที่จะบอกว่าขณะนี้ ไฟล์พอยเตอร์ไปอยู่ตำแหน่งสิ้นสุดไฟล์หรือยังซึ่งจะส่งค่ากลับมาเป็น 0 เมื่อสิ้นสุดไฟล์แล้วและจะส่งค่ากลับมาเป็น ไม่เท่ากับ 0 เมื่อยังไม่สิ้นสุดไฟล์ การใช้แสดงตัวอย่าง
sts  =  ferror(fpData);
ฟังก์ชันตำแหน่งของไฟล์พอยเตอร์
Rewind   จะเป็นฟังก์ชันในการย้ายตำแหน่งของไฟล์พอยเตอร์ให้ไปอยู่ที่หัวไฟล์ ซึ่งการใช้คำสั่งนี้แสดงตัวอย่าง
Rewind(fpData);
Ftell   เป็นฟังก์ชันที่จะส่งค่ากลับ เป็นตำแหน่งที่อยู่ของไฟล์พอยเตอร์ในขณะนั้นซึ่งค่าที่ส่งกลับมาเป็นข้อมูลชนิด  long int 

ฟังก์ชันของระบบ
Remove  เป็นฟังก์ชันที่ใช้ลบไฟล์ที่ต้องการทิ้งไป ถ้าการลบสมบรูณ์จะส่งค่ากลับมาเป็น  ()  และถ้าไม่สมบรูณ์จะส่งค่ากลับเป็น ไม่เท่ากับ 0
If(remove(“file1.dat))
Printf(“Error, file cannot be deleted”);
Rename  เป็นฟังก์ชันที่จะใช้เปลี่ยนชื่อไฟล์ที่ต้องการ ถ้าการเปลี่ยนสมบรูณ์จะส่งค่ากลับมาเป็น 0 และถ้าไม่สมบรูณ์จะส่งค่ากลับเป็น ไม่เท่ากับ 0
If(rename(“file10dat” , “file1.bak))
Printf(“Error, the file cannot be rename”);

โปรแกรมเก็บข้อมูลนักเรียน 12-9

 

เนื้อหาเพิ่มเติม

บทที่ 12 ไฟล์ (File)
Text File คือ ไฟล์ที่เก็บข้อมูลเป็นตัวอักษร
การประกาศตัวแปรใช้ชี้ไปยังไฟล์มีรูปแบบ ดังนี้
FILE *<ชื่อไฟล์พอยเตอร์>
เช่น
FILE *fpTempData; //ประกาศตัวแปรพอยเตอร์ชื่อว่า fpTempData ให้ชี้ไปยังไฟล์
การเปิดไฟล์ (สำหรับ Text File มี 3 โหมด ดังนี้)
r : เปิดเพื่ออ่าน
w : เปิดเพื่อเขียน
ถ้ามีไฟล์เดิมอยู่แล้ว จะถูกทับด้วยไฟล์ใหม่
ถ้าไม่มีไฟล์เดิมอยู่ก็จะสร้างไฟล์ใหม่ให้
a : เปิดไฟล์ขึ้นมาเพื่อเขียนต่อ
ถ้ามีไฟล์เดิมอยู่แล้ว ก็จะไปชี้ที่ท้ายไฟล์เดิมเพื่อรอให้เขียนต่อเลย
ถ้าไม่มีไฟล์เดิมอยู่ก็จะสร้างไฟล์ใหม่มาให้
มีรูปแบบการเปิดไฟล์ ดังนี้
<ชื่อไฟล์พอยเตอร์> = fopen(<"[ตำแหน่งที่ตั้ง\]ชื่อไฟล์">,<"โหมดที่ต้องการเปิด">);
เช่น
fpTempData = fopen("c:\\test.dat","r");มีรูปแบบการปิดไฟล์ ดังนี้
fclose(<ชื่อไฟล์พอยเตอร์>) ;
เช่น
fclose(fpTempData) ;
การอ่านข้อมูลจากไฟล์ขึ้นมาใช้งาน มีรูปแบบ ดังนี้
fscanf(<ชื่อไฟล์พอยเตอร์>,"<รูปแบบข้อความ>",&<ชื่อตัวแปรที่ใช้รับค่า>,...);
เช่น
fscanf(fpTempData,"%d-%d-%d",&m,&d,&y);
การเขียนข้อมูล / บันทึกข้อมูลลงสู่ไฟล์ มีรูปแบบ ดังนี้
fprintf(<ชื่อไฟล์พอยเตอร์>,"<รูปแบบข้อความ>",<ชื่อตัวแปรที่จะนำค่าลงไปเก็บ>,...)
เช่น
fprintf(fpTempData,"%d-%d-%d",m,d,y)
ฟังก์ชั่นที่ใช้ในการอ่าน หรือ เขียน ตัวอักษร
getc และ fgetc จะใช้อ่านตัวอักษรตัวต่อไปจากไฟล์ขึ้นมาใช้งาน เช่น
nextChar = getc(fpTempData); หรือ
nextChar = fgetc(fpTempData);
....................................................................Binary File คือ ไฟล์ที่เก็บข้อมูลในรูปของเลขฐานสอง
การประกาศตัวแปรใช้ชี้ไปยังไฟล์มีรูปแบบ ดังนี้
FILE *<ชื่อไฟล์พอยเตอร์>
เช่น
FILE *fpTempData; //ประกาศตัวแปรพอยเตอร์ชื่อว่า fpTempData ให้ชี้ไปยังไฟล์
การเปิดไฟล์ (สำหรับ Text File มี 3 โหมด ดังนี้)
rb : เปิดเพื่ออ่าน
wb : เปิดเพื่อเขียน
ถ้ามีไฟล์เดิมอยู่แล้ว จะถูกทับด้วยไฟล์ใหม่
ถ้าไม่มีไฟล์เดิมอยู่ก็จะสร้างไฟล์ใหม่ให้
ab : เปิดไฟล์ขึ้นมาเพื่อเขียนต่อ
ถ้ามีไฟล์เดิมอยู่แล้ว ก็จะไปชี้ที่ท้ายไฟล์เดิมเพื่อรอให้เขียนต่อเลย
ถ้าไม่มีไฟล์เดิมอยู่ก็จะสร้างไฟล์ใหม่มาให้
มีรูปแบบการเปิดไฟล์ ดังนี้
<ชื่อไฟล์พอยเตอร์> = fopen(<"[ตำแหน่งที่ตั้ง\]ชื่อไฟล์">,<"โหมดที่ต้องการเปิด">);
เช่น
fpTempData = fopen("c:\\test.dat","rb");มีรูปแบบการปิดไฟล์ ดังนี้
fclose(<ชื่อไฟล์พอยเตอร์>) ;
เช่น
fclose(fpTempData) ;
การอ่านข้อมูลจากไฟล์ขึ้นมาใช้งาน มีรูปแบบ ดังนี้
fread(<ชื่อตัวแปรที่ใช้รับค่า>,"<ขนาดของตัวแปร>,<จำนวน>,<ชื่อไฟล์พอยเตอร์>);
เช่น
fread(num,sizeof(int),1,fpTempData);
การเขียนข้อมูล / บันทึกข้อมูลลงสู่ไฟล์ มีรูปแบบ ดังนี้
fwrite(<ชื่อตัวแปรที่ใช้รับค่า>,"<ขนาดของตัวแปร>,<จำนวน>,<ชื่อไฟล์พอยเตอร์>);
เช่น
fwrite(num,sizeof(int),1,fpTempData);
ฟังก์ชั่นที่ใช้ในการจัดการไฟล์
feof(<ชื่อไฟล์พอยเตอร์>); ตรวจสอบจุดสิ้นสุดของไฟล์
เช่น
feof(fpTempData);
// สิ้นสุดไฟล์แล้วผลลัพธ์ที่ได้จะเป็น 0
// ถ้ายังไม่สิ้นสุดไฟล์ผลลัพธ์ที่ได้จะไม่เท่ากับ 0
ferror(<ชื่อไฟล์พอยเตอร์>); ตรวจสอบข้อผิดพลาดในขณะที่อ่านหรือเขียน
เช่น
ferror(fpTempData);
// ไม่มีข้อผิดพลาดผลลัพธ์ที่ได้จะเป็น 0
// ถ้ามีข้อผิดพลาดผลลัพธ์ที่ได้จะไม่เท่ากับ 0
rewind(<ชื่อไฟล์พอยเตอร์>); ย้ายตำแหน่งตัวแปรพอยเตอร์ให้ไปชี้ที่ต้นไฟล์
เช่น
rewind(fpTempData);
ftell(<ชื่อไฟล์พอยเตอร์>); ส่งค่ากลับมาเป็นที่อยู่ของตัวแปรไฟล์พอยเตอร์ปัจจุบันมาให้
เช่น
ftell(fpTempData); // จะส่งที่อยู่ของ fpTempData มาให้
remove(<ชื่อไฟล์>); ใช้สำหรับลบไฟล์ออกจากสื่อบันทึกข้อมูล
เช่น
remove("c:\\test.dat");
rename(<ชื่อไฟล์ต้นฉบับ>","<ชื่อไฟล์ใหม่>"); ใช้สำหรับเปลี่ยนชื่อไฟล์
เช่น
rename("c:\\test.dat","c:\\abc.txt");
// ก็จะทำการเปลี่ยนชื่อไฟล์ใน Drive c:\จากชื่อ Test.dat เป็น abc.txt