ไฟล์ I/O ภาษา C

บทสุดท้ายอธิบายเกี่ยวกับอุปกรณ์อินพุตและเอาต์พุตมาตรฐานที่จัดการโดยภาษาการเขียนโปรแกรม C บทนี้ครอบคลุมถึงวิธีที่โปรแกรมเมอร์ C สามารถสร้าง เปิด ปิดไฟล์ข้อความหรือไบนารีสำหรับการจัดเก็บข้อมูลของตน

ไฟล์แสดงถึงลำดับของไบต์ ไม่ว่าจะเป็นไฟล์ข้อความหรือไฟล์ไบนารี ภาษาการเขียนโปรแกรม C ให้การเข้าถึงฟังก์ชันระดับสูงและการเรียกใช้ระดับต่ำ (ระดับ OS) เพื่อจัดการไฟล์บนอุปกรณ์จัดเก็บข้อมูลของคุณ บทนี้จะนำคุณผ่านสายสำคัญสำหรับการจัดการไฟล์

การเปิดไฟล์


คุณสามารถใช้ฟังก์ชัน fopen( ) เพื่อสร้างไฟล์ใหม่หรือเปิดไฟล์ที่มีอยู่ การเรียกนี้จะเริ่มต้นวัตถุประเภท FILE ซึ่งมีข้อมูลทั้งหมดที่จำเป็นในการควบคุมสตรีม ต้นแบบของการเรียกใช้ฟังก์ชันนี้มีดังต่อไปนี้ −

FILE *fopen( const char * filename, const char * mode );


ในที่นี้ชื่อไฟล์คือตัวอักษรสตริง ซึ่งคุณจะใช้ตั้งชื่อไฟล์ของคุณ และโหมดการเข้าถึงสามารถมีค่าใดค่าหนึ่งดังต่อไปนี้:

Sr.No.Mode & Description
1NS
เปิดไฟล์ข้อความที่มีอยู่เพื่อจุดประสงค์ในการอ่าน
2w
เปิดไฟล์ข้อความสำหรับเขียน หากไม่มีอยู่ ไฟล์ใหม่จะถูกสร้างขึ้น ที่นี่โปรแกรมของคุณจะเริ่มเขียนเนื้อหาตั้งแต่ต้นไฟล์
3NS
เปิดไฟล์ข้อความสำหรับเขียนในโหมดต่อท้าย หากไม่มีอยู่ ไฟล์ใหม่จะถูกสร้างขึ้น ที่นี่โปรแกรมของคุณจะเริ่มต่อท้ายเนื้อหาในเนื้อหาไฟล์ที่มีอยู่
4r+
เปิดไฟล์ข้อความสำหรับทั้งการอ่านและการเขียน
5w+
เปิดไฟล์ข้อความสำหรับทั้งการอ่านและการเขียน ขั้นแรกให้ตัดไฟล์ให้มีความยาวเป็นศูนย์หากมีอยู่ มิฉะนั้นจะสร้างไฟล์ขึ้นหากไม่มีอยู่
6a+
เปิดไฟล์ข้อความสำหรับทั้งการอ่านและการเขียน มันสร้างไฟล์หากไม่มีอยู่ การอ่านจะเริ่มตั้งแต่ต้น แต่สามารถเขียนต่อท้ายได้เท่านั้น


หากคุณกำลังจะจัดการกับไฟล์ไบนารี คุณจะใช้โหมดการเข้าถึงต่อไปนี้แทนโหมดที่กล่าวถึงข้างต้น −

"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);


ฟังก์ชันทั้งสองนี้ควรใช้เพื่ออ่านหรือเขียนบล็อกของความทรงจำ ซึ่งมักจะเป็นอาร์เรย์หรือโครงสร้าง

Leave a Reply

Your email address will not be published. Required fields are marked *