บทที่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 |
เปิดไฟล์ขึ้นมาเพื่อเขียน
- ถ้าเปิดสำเร็จ จะได้ไฟล์ว่าง ๆ
- ถ้าเปิดไม่ได้ จะสร้างไฟล์ที่ต้องการให้ใหม่
|
a |
เปิดไฟล์ขึ้นมาเพื่อเขียนต่อ
- ถ้าเปิดสำเร็จ ไฟล์พอยเตอร์จะชี้ไปที่ปลายไฟล์
- ถ้าเปิดไม่ได้ จะสร้างไฟล์ที่ต้องการให้ใหม่
|
ชื่อไฟล์ คือ สตริงที่เป็นชื่อของไฟล์ ซึ่งอาจจะรวมกับที่อยู่ของไฟล์ (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 |
เปิดไฟล์ขึ้นมาเพื่ออ่าน
- ถ้าเปิดสำเร็จ ไฟล์พอยเตอร์จะชี้ไปที่ต้นไฟล์
- ถ้าเปิดไม่ได้ จะส่งค่ากลับเป็นค่า Error (NuII)
|
wb |
เปิดไฟล์ขึ้นมาเพื่อเขียน
- ถ้าเปิดสำเร็จ จะได้ไฟล์ว่าง ๆ
- ถ้าเปิดไม่ได้ จะสร้างไฟล์ที่ต้องการให้ใหม่
|
ab |
เปิดไฟล์ขึ้นมาเพื่อเขียนต่อ
- ถ้าเปิดสำเร็จ ไฟล์พอยเตอร์จะชี้ไปที่ปลายไฟล์
- ถ้าเปิดไม่ได้ จะสร้างไฟล์ที่ต้องการให้ใหม่
|
การอ่านและเขียนไฟล์
ฟังก์ชันในการอ่านและเขียนไฟล์นั้น คือ ฟังก์ชัน 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