การประมวลผลกับไฟล์เพื่ออ่านหรือเขียนข้อมูลนั้นจะไม่กระทำกับไฟล์โดยตรง แต่จะกระทำผ่านตัวกลางที่เรียกว่า บัฟเฟอร์ (Buffer) โดยบัฟเฟอร์คือพื้นที่ในหน่วยความจำหลักของเครื่องคอมพิวเตอร์ที่เครื่องจะ เตรียมไว้สำหรับประมวลผลกับไฟล์ ถ้าทำการประมวลผลกับหลายๆ ไฟล์ แต่ละไฟล์ก็จะมีบัฟเฟอร์เฉพาะสำหรับไฟล์นั้น อย่างเช่น ถ้าเราจะประมวลผลกับไฟล์ชื่อ A, B และ C พื้นที่ในหน่วยความจำจะถูกกำหนดแยกเอาไว้ 3 ส่วนด้วยกัน เพื่อให้เป็นบัฟเฟอร์ของไฟล์ A, B และ C
โครงสร้างของไฟล์ในภาษาซี จะเก็บข้อมูลในลักษณะเรียงต่อกันตั้งแต่ต้นจนจบไฟล์ ไม่มีการแบ่งช่วงของข้อมูล ดังนั้นการที่จะเลือกระบุข้อมูลใดๆ ก็ตามในไฟล์ได้นั้น เราจะต้องรู้ตำแหน่งของข้อมูล ซึ่งการระบุตำแหน่งของข้อมูลภายในไฟล์สามารถทำได้โดยใช้ตัวชี้ตำแหน่งไฟล์ (file pointer)
ตัวชี้ตำแหน่งไฟล์จะเป็นตัวบอกตำแหน่งภายในไฟล์ โดยจะเป็นตัวบอกว่าขณะนั้นทำการประมวลผลอยู่ ณ ตำแหน่งใดภายในไฟล์ ทำให้เราสามารถกำหนดได้ว่าจะอ่านหรือเขียนข้อมูลโดยเริ่มต้นจากจุดใดและไป สิ้นสุดที่ตำแหน่งใดในไฟล์ เมื่อเราทำการเปิดไฟล์ตัวชี้ตำแหน่งไฟล์จะถูกสร้างขึ้น โดยตัวชี้ตำแหน่งไฟล์จะชี้ไปที่จุดเริ่มต้นของไฟล์ที่ทำการเปิดนั้น เมื่ออ่านหรือเขียนข้อมูลจากไฟล์ตัวชี้ตำแหน่งไฟล์ก็จะเลื่อนไปเรื่อยๆ ตามจำนวนของข้อมูล
ในกรณีที่ประมวลผลกับหลายไฟล์ เมื่อทำการเปิดไฟล์ตัวชี้ตำแหน่งไฟล์จะถูกสร้างขึ้นเฉพาะสำหรับแต่ละไฟล์ พร้อมกับชี้ไปที่ตำแหน่งเริ่มต้นของไฟล์เหล่านั้น
ประเภทของไฟล์
ไฟล์ข้อมูลสามารถแบ่งออกได้เป็น 2 ประเภทด้วยกัน ดังนี้9.2.1 เท็กซ์ไฟล์ (Text File) คือ ไฟล์ข้อมูลที่มีการเก็บข้อมูลเป็นบรรทัด เช่น ไฟล์ข้อความที่สร้างโดยโปรแกรมเอดิเตอร์ต่างๆ หรือไฟลืที่มีนามสกุล c , txt, bat เป็นต้น เท็กซ์ไฟล์จะถูกเก็บไว้ในหน่วยความจำสำรอง และเก็บในรูปแบบรหัสแอสกี ซึ่งก็คือไฟล์ตัวอักษร
9.2.2 ไบนารี่ไฟล์ (Binary File) คือ ไฟล์ที่มีการเก็บข้อมูลในรูปแบบเลขฐานสอง เช่น ไฟล์โปรแกรมต่างๆ ที่มีนามสกุล exe, com, obj เป็นต้น ดังนั้นเราจึงไม่สามารถอ่านข้อมูลในไฟล์ประเภทนี้ได้รู้เรื่อง
การเปิดไฟล์
ในการทำงานใดๆ กับไฟล์ไม่ว่าจะเป็นการอ่านข้อมูลจากไฟล์หรือเขียนข้อมูลลงไฟล์ สิ่งแรกที่ต้องกระทำก่อนก็คือ การเปิดไฟล์ โดยเมื่อทำการเปิดไฟล์ขึ้นมาแล้วตัวชี้ตำแหน่งไฟล์จะถูกสร้างขึ้นเพื่อชี้ ตำแหน่งภายในไฟล์นั้น ซึ่งตัวชี้ตำแหน่งไฟล์นี้เราจะนำไปใช้ในการอ่านหรือเขียนข้อมูลกับไฟล์
ในการเปิดไฟล์จะต้องใช้ 2 คำสั่งด้วยกัน โดยเริ่มจากคำสั่งแรกซึ่งเป็นคำสั่งสำหรบสร้างตัวแปรพอยน์เตอร์ชนิดไฟล์ สำหรับเก็บค่าของตัวชี้ตำแหน่งไฟล์ที่จะได้จากการเปิดไฟล์ ดังนี้
รูปแบบ
FILE *fp;
|
โดยที่ | FILE | หมายถึง | สำหรับสร้างตัวแปรชนิดไฟล์ ซึ่งต้องเขียนเป็นตัวพิมพ์ใหญ่ทั้งหมด |
fp | หมายถึง | ชื่อของตัวแปรที่จะสร้างขึ้นเพื่อเก็บค่าของตัวชี้ตำแหน่งไฟล์ ซึ่งจะต้องตามหลังีเครื่องหมาย * เพื่อบอกว่าเป็นตัวแปรประเภทพอยน์เตอร์ |
จากนั้นเราจะทำการเปิดไฟล์โดยเรียกใช้ฟังก์ชัน fopen() ซึ่งเป็นไลบรารี่ฟังก์ชันที่อยู่ในไฟล์ stdio.h ดังนั้นจึงต้องเขียนคำสั่ง #include <stdio.h> ไว้ที่ส่วนหัวของโปรแกรมด้วย รูปแบบของการเรียกใช้ฟังก์ชัน fopen() แสดงได้ดังนี้
รูปแบบ
fp = fopen("name","mode");
|
โดยที่ | fp | หมายถึง | ตัวแปรที่สร้างขึ้นเพื่อเก็บค่าของตัวชี้ตำแหน่งไฟล์ |
name | หมายถึง | ชื่อของไฟล์ที่จะทำการเปิด | |
mode | หมายถึง | โหมดของไฟล์ โดยโหมดของไฟล์จะเป็นตัวบอกว่าเราต้องการเปิดไฟล์เพื่อวัตถุประสงค์ใด ซึ่งมีโหมดในการเปิดไฟล์ดังนี้ |
โหมดของเท็กซ์ไฟล์
|
โหมดของไบนารีไฟล์
|
ความหมาย
|
r
|
rb
| เปิดไฟล์เพื่ออ่านข้อมูลจากไฟล์ที่ถูกสร้างไว้แล้วเพียงอย่างเดียว ไม่สามารถเขียนข้อมูลลงไปในไฟล์ได้ |
w
|
wb
| เปิดไฟล์เพื่อสำหรับเขียนข้อมูล โดยถ้าไฟล์นั้นไม่มีอยู่ เครื่องจะทำการสร้างไฟล์ขึ้นมาใหม่ แต่ถ้ามีไฟล์อยู่แล้วข้อมูลเก่าจะถูกลบทิ้งแล้วแทนที่ด้วยข้อมูลใหม่ |
a
|
ab
| เปิดไฟล์สำหรับเขียนข้อมูลต่อท้ายลงไปในไฟล์ ที่ถูกสร้างไว้แล้ว |
r+
|
r+b
| เปิดไฟล์สำหรับอ่านและเขียนข้อมูลลงในไฟล์ที่ถูกสร้างไว้แล้ว |
w+
|
w+b
| เปิดไฟล์สำหรับอ่านและเขียนข้อมูลทับ โดยเครื่องจะทำการสร้างไฟล์ขึ้นมาใหม่ ถ้าไฟล์ที่ต้องการเปิดยังไม่มี |
a+
|
a+b
| เปิดไฟล์สำหรับเขียนข้อมูลต่อท้ายลงไปในไฟล์ โดยถ้าไฟล์นั้นไม่มีอยู่ เครื่องจะทำการสร้างไฟล์ขึ้นมาใหม่ |
การปิดไฟล์
หลังจากที่มีการอ่านหรือบันทึกแฟ้มข้อมูลเสร็จแล้ว จะต้องมีการปิดแฟ้มข้อมูลเสมอ การปิดแฟ้มจะเกิดการนำข้อมูลออกจากอินพุตบัฟเฟอร์หรือเอาท์พุตบัฟเฟอร์ให้หมด เพื่อไม่ให้ข้อมูลหายจากระบบ ในภาษาซีมีฟังก์ชัน 2 ฟังก์ชันที่ใช้ในการปิดแฟ้มข้อมูล คือ fclose ( ) และ fcloseall ( )
9.4.1 ฟังก์ชัน fclose( ) ฟังก์ชัน fclose( ) ถูกนิยามไว้ในแฟ้ม stdio.h ฟังก์ชันนี้จะทำหน้าที่ปิดแฟ้มข้อมูลที่กำหนดโดยมีการบันทึกข้อมูลใน บัฟเฟอร์ทั้งหมดเก็บเข้าแฟ้ม แล้วจะยกเลิกการใช้บัฟเฟอร ์ทำให้มีเนื้อที่เปิดแฟ้มใหม่เพิ่มได้อีก ถ้าปิดแฟ้มข้อมูลสำเร็จจะส่งกลับเป็น NULL หรือ 0 ถ้ามีข้อผิดพลาดจะส่งค่ากลับเป็น EOF
รูปแบบ
fclose (fp);
|
โดยที่ | fp | หมายถึง | ชื่อของตัวแปรที่จะสร้างขึ้นเพื่อเก็บค่าของตัวชี้ตำแหน่งไฟล์ ซึ่งจะต้องตามหลังีเครื่องหมาย * เพื่อบอกว่าเป็นตัวแปรประเภทพอยน์เตอร์ |
9.4.2 ฟังก์ชัน fcloseall ( ) ฟังก์ชัน fcloseall ( ) ถูกนิยามไว้ในแฟ้ม stdio.h ฟังก์ชันนี้จะปิดแฟ้มข้อมูลทั้งหมดที่ได้เปิดไว้ และให้ค่ากลับมายังฟังก์ชันเป็นจำนวนแฟ้มที่ถูกปิด ถ้ามีข้อผิดพลาดจะให้ค่ากลับเป็น EOF
รูปแบบ
fcloseall ();
|
เมื่อเราเขียนโปรแกรมเพื่ออ่านข้อมูลจากไฟล์ ข้อมูลภายในไฟล์จะถูกอ่านเริ่มตั้งแต่ตรงที่ตัวชี้ตำแหน่งไฟล์ชี้อยู่ไปจนครบตามจำนวนที่กำหนด หรือจนจบไฟล์ ซึ่งตัวชี้ตำแหน่งไฟล์ก็จะเลื่อนตามไปเรื่อยๆ ตามข้อมูลที่อ่าน ข้อมูลส่วนที่อ่านมาจากไฟล์จะถูกนำไปเก็บไว้ที่บัฟเฟอร์ ดังนั้นจริงๆ แล้วโปรแกรมที่เราเขียนนั้นอ่านข้อมูลมาจากบัฟเฟอร์อีกทีหนึ่ง ไม่ใช่จากไฟล์โดยตรง ซึ่งฟังก์ชันที่ใช้ในการอ่านข้อมูลจากไฟล์มีดังนี้
9.5.1 อ่านข้อมูลทีละอักขระด้วย getc()
9.5.2 อ่านข้อมูลทีละอักขระด้วย fgetc()
9.5.3 อ่านข้อมูลเป็นข้อความด้วย fgets()
9.5.4 อ่านข้อมูลตามรูปแบบด้วย fscanf()
9.5.5 อ่านข้อมูลทีละเรคคอร์ดด้วย fread()
9.5.1 อ่านข้อมูลทีละอักขระด้วย getc() ฟังก์ชัน getc( ) ใช้ในการอ่านข้อมูลชนิดอักขระจากไฟล์ โดยจะอ่านออกมาทีละ 1 อักขระเท่านั้น ซึ่งถูกนิยามไว้ในแฟ้ม stdio.h และมีรูปแบบการใช้งานดังนี้
รูปแบบ
variable = getc(fp);
|
โดยที่ | variable | หมายถึง | ตัวแปรชนิด char เพื่อใช้เก็บค่าของตัวอักขระที่อ่านออกมาจากไฟล์ |
fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
variable = fgetc(fp);
|
โดยที่ | variable | หมายถึง | ตัวแปรชนิด char เพื่อใช้เก็บค่าของตัวอักขระที่อ่านออกมาจากไฟล์ |
fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fgets (variable, total, fp);
|
โดยที่ | variable | หมายถึง | ตัวแปรชุดชนิด char เพื่อใช้เก็บข้อความที่อ่านออกมาจากไฟล์ |
total | หมายถึง | ความยาวของข้อความที่ต้องการอ่านจากไฟล์ โดยจำนวนที่เรากำหนดจะถูกลบออกหนึ่งเพื่อใช้สำหรับ \0 ปิดท้าย | |
fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fscanf (fp, "format", &variable);
|
โดยที่ | fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
format | หมายถึง | รูปแบบที่ใช้ในการอ่านข้อมูล จากไฟล์ ซึ่งจะเป็นแบบเดียวกับฟังก์ชัน scanf () | |
variable | หมายถึง | ตัวแปรชุดชนิด char เพื่อใช้เก็บข้อความที่อ่านออกมาจากไฟล์ |
รูปแบบ
fread (ptr, size, total, fp);
|
โดยที่ | ptr | หมายถึง | ค่าตำแหน่งในหน่วยความจำ ซึ่งจะนำข้อมูลที่อ่านได้มาเก็บไว้ |
size | หมายถึง | ขนาดของเรคคอร์ด โดยมีหน่วยเป็นไบต์ | |
total | หมายถึง | จำนวนเรคคอร์ดหรือชุดของข้อมูลที่จะอ่าน | |
fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
fread (&name, 15 , 1, fp);
จะหมายถึง ให้ทำการอ่านข้อมูลมาเก็บไว้ที่หน่วยความจำในตำแหน่งของตัวแปร name ทำให้ต่อไปเมื่อจะใช้งานข้อมูลที่อ่านมาก็สามารถเรียกใช้ผ่านตัวแปร name ได้ทันที
เขียนข้อมูลลงในไฟล์
เมื่อเราเขียนโปรแกรมเพื่อเขียนข้อมูลลงในไฟล์ ข้อมูลเหล่านั้นจะถูกเขียนลงในบัฟเฟอร์ก่อน ในระหว่างที่เขียนข้อมูลนั้นี่ตัวชี้ตำแหน่งไฟล์จะเลื่อนตำแหน่งชี้ไป เรื่อยๆ ตามปริมาณของข้อมูลที่ทำการเขียน เมื่อบัฟเฟอร์เต็มหรือทำการปิดไฟล์ข้อมูลเหล่านั้นจึงจะถูกเขียนลงไปในไฟล์ จริงๆ ฟังก์ชันที่ใช้ในการเขียนข้อมูลลงไฟล์มีดังนี้
9.6.1 เขียนข้อมูลทีละอักขระด้วย putc()
9.6.2 เขียนข้อมูลทีละอักขระด้วย fputc()
9.6.3 เขียนข้อมูลเป็นข้อความด้วย fputs()
9.6.4 เขียนข้อมูลตามรูปแบบด้วย fprintf()
9.6.5 เขียนข้อมูลทีละเรคคอร์ดด้วย fwrite()
9.6.1 เขียนข้อมูลทีละอักขระด้วย putc() ฟังก์ชัน putc( ) ถูกนิยามไว้ในแฟ้ม stdio.h ซึ่งใช้สำหรับเขียนข้อมูลชนิดอักขระลงในไฟล์ทีละ 1 อักขระเท่านั้น โดยมีรูปแบบการใช้งานดังนี้
รูปแบบ
putc (ch, fp);
|
โดยที่ | ch | หมายถึง | อักขระ 1 ตัวซึ่งอาจจะอยู่ในรูปแบบของอักขระจริงๆ (เขียนภายในเครื่องหมาย ' ' ) หรือตัวแปรชนิด char ที่เก็บอักขระเอาไว้ก็ได้ |
fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fputc (ch, fp);
|
โดยที่ | ch | หมายถึง | อักขระ 1 ตัวซึ่งอาจจะอยู่ในรูปแบบของอักขระจริงๆ (เขียนภายในเครื่องหมาย ' ' ) หรือตัวแปรชนิด char ที่เก็บอักขระเอาไว้ก็ได้ |
fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fputs (str, fp);
|
โดยที่ | str | หมายถึง | ข้อความที่ต้องการเขียนลงในไฟล์ โดยอาจจะเป็นข้อความที่เขียนภายในเครื่องหมาย " " หรือตัวแปรที่เก็บข้อความเอาไว้ก็ได้เช่นกัน |
fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fscanf (fp, "control", value);
|
โดยที่ | fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
control | หมายถึง | ส่วนที่ใช้ควบคุมรูปแบบของข้อมูลที่จะเขียนลงในไฟล์ ซึ่งมีการใช้งานเหมือนฟังก์ชัน printf () | |
value | หมายถึง | ค่าของตัวแปร หรือนิพจน์ ที่ต้องการเขียนลงในไฟล์ โดยถ้ามีมากกว่าหนึ่งตัว ให้ใช้เครื่องหมาย , (comma) คั่นระหว่างแต่ละตัว |
รูปแบบ
fwrite (ptr, size, total, fp);
|
โดยที่ | ptr | หมายถึง | ตำแหน่งในหน่วยความจำของข้อมูลที่จะเขียนลงในไฟล์ |
size | หมายถึง | ขนาดของเรคคอร์ด โดยมีหน่วยเป็นไบต์ | |
total | หมายถึง | จำนวนเรคคอร์ดหรือชุดของข้อมูลที่ต้องการเขียนลงในไฟล์ | |
fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
ตัวชี้ตำแหน่งไฟล์
เมื่อเปิดไฟล์ได้สำเร็จ ตัวชี้ตำแหน่งไฟล์จะถูกกำหนดให้ชี้ไปยังข้อมูลแรกของไฟล์ และโดยปกติทุกครั้งหลังจากการเขียนหรืออ่านข้อมูลแต่ละครั้ง ตัวชี้ตำแหน่งไฟล์จะเลื่อนไปยังข้อมูลถัดไปโดยอัตโนมัติ แต่ในภาษาซียังมีฟังก์ชันอีกกลุ่มหนึ่งที่ใช้ควบคุมตัวชี้ตำแหน่งไฟล์ตามต้องการ ซึ่งฟังก์ชันกลุ่มนี้ประกอบไปด้วย
9.7.1 กำหนดตำแหน่งไปที่จุดเริ่มต้นไฟล์ด้วย rewind ()
9.7.2 หาค่าตำแหน่งของตัวชี้ตำแหน่งด้วย ftell ()
9.7.3 ย้ายตำแหน่งตัวชี้ด้วย fseek ()
9.7.1 กำหนดตำแหน่งไปที่จุดเริ่มต้นไฟล์ด้วย rewind () ฟังก์ชัน rewind () ใช้ในการเลื่อนตัวชี้ตำแหน่งไฟล์ให้กลับไปที่จุดเริ่มต้นไฟล์ โดยมีรูปแบบการใช้งานดังนี้
รูปแบบ
rewind (fp);
|
โดยที่ | fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
ftell (fp);
|
โดยที่ | fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
รูปแบบ
fseek (fp, offset, referent);
|
โดยที่ | fp | หมายถึง | ตัวชี้ตำแหน่งไฟล์ |
referent | หมายถึง | ตำแหน่งอ้างอิงในการเลื่อนตัวชี้ตำแหน่งไฟล์ ซึ่งมีอยู่ 3 แบบด้วยกัน คือ SEEK_SET : ตำแหน่งเริ่มต้นไฟล์ SEEK_CUR : ตำแหน่งปัจจุบันที่ตัวชี้ตำแหน่งไฟล์อยู่ SEEK_END : ตำแหน่งจบไฟล์ | |
offset | หมายถึง | จำนวนไบต์ที่ต้องการเลื่อนตัวชี้ตำแหน่งไฟล์ |
การลบไฟล์
ในกรณีที่ไม่ต้องการใช้งานไฟล์ใดแล้ว สามารถลบทิ้งได้โดยใช้ฟังก์ชัน remove () ซึ่งมีรูปแบบการใช้งานดังนี้
รูปแบบ
remove (name);
|
โดยที่ | name | หมายถึง | ชื่อไฟล์ที่ต้องการจะลบ |
ตัวอย่าง โปรแกรมแสดงการทำงานของฟังก์ชัน remove ()
#include <stdio.h> main() { int result; result = remove ( "a:/file1.txt" ); if ( !result ) { printf ( "Success" ); } else { printf ( "Fail" ); } } |
การเปลี่ยนชื่อไฟล์
ในกรณีที่ต้องการเปลี่ยนชื่อของไฟล์ สามารถทำได้โดยใช้ฟังก์ชัน rename () ซึ่งมีรูปแบบการใช้งานดังนี้
รูปแบบ
remove (old, new);
|
โดยที่ | old | หมายถึง | ชื่อไฟล์เดิมที่ต้องการจะเปลี่ยนชื่อ |
new | หมายถึง | ชื่อไฟล์ใหม่ทีจะเปลี่ยนไปใช้ |
ตัวอย่าง โปรแกรมแสดงการทำงานของฟังก์ชัน rename ()
#include <stdio.h> main() { int result; result = rename ( "a:/file1.txt", "a:/filea.txt" ); if ( !result ) { printf ( "Success" ); } else { printf ( "Fail" ); } } |
โปรแกรมข้างต้นจะทำการเปลี่ยนชื่อไฟล์ที่ชื่อ file1.txt ซึ่งอยู่ที่ไดร์ฟ A: ให้เป็นชื่อ filea.txt โดยถ้าสามารถเปลี่ยนได้จะแสดงข้อความว่า Success แต่ถ้าไม่สามารถเปลี่ยนชื่อได้ จะแสดงข้อความว่า Fail
ไม่มีความคิดเห็น:
แสดงความคิดเห็น