ไฟล์ I/O ภาษา C
บทสุดท้ายอธิบายเกี่ยวกับอุปกรณ์อินพุตและเอาต์พุตมาตรฐานที่จัดการโดยภาษาการเขียนโปรแกรม C บทนี้ครอบคลุมถึงวิธีที่โปรแกรมเมอร์ C สามารถสร้าง เปิด ปิดไฟล์ข้อความหรือไบนารีสำหรับการจัดเก็บข้อมูลของตน
ไฟล์แสดงถึงลำดับของไบต์ ไม่ว่าจะเป็นไฟล์ข้อความหรือไฟล์ไบนารี ภาษาการเขียนโปรแกรม C ให้การเข้าถึงฟังก์ชันระดับสูงและการเรียกใช้ระดับต่ำ (ระดับ OS) เพื่อจัดการไฟล์บนอุปกรณ์จัดเก็บข้อมูลของคุณ บทนี้จะนำคุณผ่านสายสำคัญสำหรับการจัดการไฟล์
การเปิดไฟล์
คุณสามารถใช้ฟังก์ชัน fopen( ) เพื่อสร้างไฟล์ใหม่หรือเปิดไฟล์ที่มีอยู่ การเรียกนี้จะเริ่มต้นวัตถุประเภท FILE ซึ่งมีข้อมูลทั้งหมดที่จำเป็นในการควบคุมสตรีม ต้นแบบของการเรียกใช้ฟังก์ชันนี้มีดังต่อไปนี้ −
FILE *fopen( const char * filename, const char * mode );
ในที่นี้ชื่อไฟล์คือตัวอักษรสตริง ซึ่งคุณจะใช้ตั้งชื่อไฟล์ของคุณ และโหมดการเข้าถึงสามารถมีค่าใดค่าหนึ่งดังต่อไปนี้:
Sr.No. | Mode & Description |
---|---|
1 | NS เปิดไฟล์ข้อความที่มีอยู่เพื่อจุดประสงค์ในการอ่าน |
2 | w เปิดไฟล์ข้อความสำหรับเขียน หากไม่มีอยู่ ไฟล์ใหม่จะถูกสร้างขึ้น ที่นี่โปรแกรมของคุณจะเริ่มเขียนเนื้อหาตั้งแต่ต้นไฟล์ |
3 | NS เปิดไฟล์ข้อความสำหรับเขียนในโหมดต่อท้าย หากไม่มีอยู่ ไฟล์ใหม่จะถูกสร้างขึ้น ที่นี่โปรแกรมของคุณจะเริ่มต่อท้ายเนื้อหาในเนื้อหาไฟล์ที่มีอยู่ |
4 | r+ เปิดไฟล์ข้อความสำหรับทั้งการอ่านและการเขียน |
5 | w+ เปิดไฟล์ข้อความสำหรับทั้งการอ่านและการเขียน ขั้นแรกให้ตัดไฟล์ให้มีความยาวเป็นศูนย์หากมีอยู่ มิฉะนั้นจะสร้างไฟล์ขึ้นหากไม่มีอยู่ |
6 | a+ เปิดไฟล์ข้อความสำหรับทั้งการอ่านและการเขียน มันสร้างไฟล์หากไม่มีอยู่ การอ่านจะเริ่มตั้งแต่ต้น แต่สามารถเขียนต่อท้ายได้เท่านั้น |
หากคุณกำลังจะจัดการกับไฟล์ไบนารี คุณจะใช้โหมดการเข้าถึงต่อไปนี้แทนโหมดที่กล่าวถึงข้างต้น −
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
การปิดไฟล์
หากต้องการปิดไฟล์ ให้ใช้ฟังก์ชัน fclose( ) ต้นแบบของฟังก์ชันนี้คือ −
int fclose( FILE *fp );
fclose (-) กลับมาทำงานเป็นศูนย์ในความสำเร็จหรือ EOF ถ้ามีข้อผิดพลาดในการปิดไฟล์ ฟังก์ชันนี้จะล้างข้อมูลที่ค้างอยู่ในบัฟเฟอร์ของไฟล์ ปิดไฟล์ และปล่อยหน่วยความจำที่ใช้สำหรับไฟล์ EOF เป็นค่าคงที่ที่กำหนดไว้ในส่วนหัวของไฟล์ stdio.h
มีฟังก์ชันต่างๆ ที่ไลบรารีมาตรฐาน C จัดเตรียมไว้ให้สำหรับอ่านและเขียนไฟล์ ทีละอักขระ หรือในรูปแบบของสตริงที่มีความยาวคงที่
การเขียนไฟล์
ต่อไปนี้เป็นฟังก์ชันที่ง่ายที่สุดในการเขียนอักขระแต่ละตัวไปยังสตรีม −
int fputc( int c, FILE *fp );
ฟังก์ชัน fputc() เขียนค่าอักขระของอาร์กิวเมนต์ c ไปยังเอาต์พุตสตรีมที่อ้างอิงโดย fp ส่งคืนอักขระที่เขียนเมื่อสำเร็จ มิฉะนั้น EOF หากมีข้อผิดพลาด คุณสามารถใช้ฟังก์ชันต่อไปนี้เพื่อเขียนสตริงที่สิ้นสุดด้วยค่า null ไปยังสตรีม −
int fputs( const char *s, FILE *fp );
ฟังก์ชัน fputs() เขียนสตริงsไปยังเอาต์พุตสตรีมที่อ้างอิงโดย fp ส่งคืนค่าที่ไม่เป็นลบสำหรับความสำเร็จ มิฉะนั้น EOF จะถูกส่งกลับในกรณีที่มีข้อผิดพลาด คุณสามารถใช้ฟังก์ชัน int fprintf(FILE *fp,const char *format, …) เพื่อเขียนสตริงลงในไฟล์ได้ ลองตัวอย่างต่อไปนี้
#include <stdio.h>
main() {
FILE *fp;
fp = fopen("test.txt", "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
fclose(fp);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะสร้างไฟล์ใหม่ test.txt และเขียนสองบรรทัดโดยใช้สองฟังก์ชันที่แตกต่างกัน ให้เราอ่านไฟล์นี้ในหัวข้อถัดไป
การอ่านไฟล์
ด้านล่างนี้เป็นฟังก์ชันที่ง่ายที่สุดในการอ่านอักขระตัวเดียวจากไฟล์ −
int fgetc( FILE * fp );
fgetc () ฟังก์ชั่นอ่านอักขระจากแฟ้มใส่อ้างอิงโดย FP ค่าตอบแทนเป็นอ่านตัวอักษรหรือในกรณีของข้อผิดพลาดใด ๆ ก็จะส่งกลับ EOF ฟังก์ชันต่อไปนี้ช่วยให้อ่านสตริงจากสตรีม −
char *fgets( char *buf, int n, FILE *fp );
ฟังก์ชั่น fgets() อ่านได้มากถึง n-1 อักขระจากอินพุตสตรีมที่อ้างอิงโดย fp มันคัดลอกสตริงการอ่านลงในบัฟเฟอร์ buf โดยต่อท้ายอักขระ null เพื่อยุติสตริง
หากฟังก์ชันนี้พบอักขระขึ้นบรรทัดใหม่ ‘\n’ หรือจุดสิ้นสุดของไฟล์ EOF ก่อนที่พวกเขาจะอ่านจำนวนอักขระสูงสุด ฟังก์ชันจะส่งคืนเฉพาะอักขระที่อ่านจนถึงจุดนั้นรวมถึงอักขระขึ้นบรรทัดใหม่ด้วย คุณยังสามารถใช้ฟังก์ชัน int fscanf(FILE *fp, const char *format, …) เพื่ออ่านสตริงจากไฟล์ แต่จะหยุดอ่านหลังจากพบอักขระเว้นวรรคตัวแรก
#include <stdio.h>
main() {
FILE *fp;
char buff[255];
fp = fopen("test.txt", "r");
fscanf(fp, "%s", buff);
printf("1 : %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("2: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("3: %s\n", buff );
fclose(fp);
}
เมื่อรวบรวมและดำเนินการโค้ดข้างต้น มันจะอ่านไฟล์ที่สร้างขึ้นในส่วนก่อนหน้าและให้ผลลัพธ์ดังต่อไปนี้:
1 : This
2: is testing for fprintf...
3: This is testing for fputs...
มาดูรายละเอียดเพิ่มเติมเล็กน้อยเกี่ยวกับสิ่งที่เกิดขึ้นที่นี่ ครั้งแรก fscanf () อ่านเพียงแค่นี้เพราะหลังจากนั้นก็พบช่องว่างสายที่สองสำหรับ fgets () ซึ่งอ่านบรรทัดที่เหลือจนกว่าจะพบจุดสิ้นสุดของบรรทัด ในที่สุด การโทรครั้งสุดท้าย fgets() จะอ่านบรรทัดที่สองโดยสมบูรณ์
ฟังก์ชันไบนารี I/O
มี 2 ฟังก์ชันที่สามารถใช้สำหรับไบนารีอินพุตและเอาต์พุต −
size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
ฟังก์ชันทั้งสองนี้ควรใช้เพื่ออ่านหรือเขียนบล็อกของความทรงจำ ซึ่งมักจะเป็นอาร์เรย์หรือโครงสร้าง