การจัดการไฟล์ใน C - วิธีการเปิดปิดและเขียนลงไฟล์

หากคุณเคยเขียนhelloworldโปรแกรมC มาก่อนคุณรู้จักไฟล์ I / O พื้นฐานใน C แล้ว:

/* A simple hello world in C. */ #include  // Import IO functions. #include  int main() { // This printf is where all the file IO magic happens! // How exciting! printf("Hello, world!\n"); return EXIT_SUCCESS; }

การจัดการไฟล์เป็นส่วนที่สำคัญที่สุดอย่างหนึ่งของการเขียนโปรแกรม ใน C เราใช้ตัวชี้โครงสร้างของประเภทไฟล์เพื่อประกาศไฟล์:

FILE *fp;

C มีฟังก์ชันบิลด์อินจำนวนมากเพื่อดำเนินการไฟล์พื้นฐาน:

  • fopen() - สร้างไฟล์ใหม่หรือเปิดไฟล์ที่มีอยู่
  • fclose() - ปิดไฟล์
  • getc() - อ่านอักขระจากไฟล์
  • putc() - เขียนอักขระลงในไฟล์
  • fscanf() - อ่านชุดข้อมูลจากไฟล์
  • fprintf() - เขียนชุดข้อมูลลงในไฟล์
  • getw() - อ่านจำนวนเต็มจากไฟล์
  • putw() - เขียนจำนวนเต็มลงในไฟล์
  • fseek() - กำหนดตำแหน่งเป็นจุดปรารถนา
  • ftell() - ให้ตำแหน่งปัจจุบันในไฟล์
  • rewind() - กำหนดตำแหน่งเป็นจุดเริ่มต้น

การเปิดไฟล์

fopen()ฟังก์ชั่นที่ใช้ในการสร้างไฟล์หรือเปิดไฟล์ที่มีอยู่:

fp = fopen(const char filename,const char mode);

มีหลายโหมดสำหรับการเปิดไฟล์:

  • r - เปิดไฟล์ในโหมดอ่าน
  • w - เปิดหรือสร้างไฟล์ข้อความในโหมดเขียน
  • a - เปิดไฟล์ในโหมดผนวก
  • r+ - เปิดไฟล์ทั้งในโหมดอ่านและเขียน
  • a+ - เปิดไฟล์ทั้งในโหมดอ่านและเขียน
  • w+ - เปิดไฟล์ทั้งในโหมดอ่านและเขียน

นี่คือตัวอย่างของการอ่านข้อมูลจากไฟล์และเขียนลงในไฟล์:

#include #include main() { FILE *fp; char ch; fp = fopen("hello.txt", "w"); printf("Enter data"); while( (ch = getchar()) != EOF) { putc(ch,fp); } fclose(fp); fp = fopen("hello.txt", "r"); while( (ch = getc(fp)! = EOF) printf("%c",ch); fclose(fp); }

ตอนนี้คุณอาจกำลังคิดว่า "นี่แค่พิมพ์ข้อความบนหน้าจอไฟล์นี้ IO เป็นอย่างไร"

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

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

แล้วสิ่งนี้เกี่ยวข้องกับhelloworldและไฟล์ IO อย่างไร?

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

มีสตรีมอื่น ๆ อีกสองรายการ (เช่นไฟล์) ที่พร้อมใช้งานสำหรับคุณด้วยความพยายามstdinและstderr. stdinหมายถึงอินพุตมาตรฐานซึ่งเชลล์ของคุณมักจะติดกับแป้นพิมพ์ stderrแสดงถึงเอาต์พุตข้อผิดพลาดมาตรฐานซึ่งโดยปกติเชลล์ของคุณจะยึดติดกับเทอร์มินัล

ไฟล์พื้นฐาน IO หรือฉันเรียนรู้การวางท่ออย่างไร

พอทฤษฎีมาเริ่มธุรกิจด้วยการเขียนโค้ดกันเถอะ! วิธีที่ง่ายที่สุดในการเขียนไปยังไฟล์คือเปลี่ยนเส้นทางสตรีมเอาต์พุตโดยใช้เครื่องมือเปลี่ยนเส้นทางเอาต์พุต, >.

หากคุณต้องการต่อท้ายคุณสามารถใช้>>:

# This will output to the screen... ./helloworld # ...but this will write to a file! ./helloworld > hello.txt

เนื้อหาของhello.txtพินัยกรรมไม่น่าแปลกใจเลย

Hello, world!

สมมติว่าเรามีโปรแกรมอื่นที่เรียกว่าgreetคล้ายกับhelloworldที่ทักทายคุณด้วยname:

#include  #include  int main() { // Initialize an array to hold the name. char name[20]; // Read a string and save it to name. scanf("%s", name); // Print the greeting. printf("Hello, %s!", name); return EXIT_SUCCESS; }

แทนที่จะอ่านจากแป้นพิมพ์เราสามารถเปลี่ยนเส้นทางstdinไปอ่านจากไฟล์โดยใช้<เครื่องมือ:

# Write a file containing a name. echo Kamala > name.txt # This will read the name from the file and print out the greeting to the screen. ./greet  Hello, Kamala! # If you wanted to also write the greeting to a file, you could do so using ">".

หมายเหตุ: ตัวดำเนินการเปลี่ยนเส้นทางเหล่านี้อยู่ในbashและเชลล์ที่คล้ายกัน

ข้อตกลงที่แท้จริง

วิธีการข้างต้นใช้ได้กับกรณีพื้นฐานที่สุดเท่านั้น หากคุณต้องการทำสิ่งที่ใหญ่กว่าและดีกว่าคุณอาจต้องการทำงานกับไฟล์จากภายใน C แทนที่จะใช้ผ่านเชลล์

fopenเพื่อให้บรรลุนี้คุณจะใช้ฟังก์ชั่นที่เรียกว่า ฟังก์ชันนี้รับพารามิเตอร์สตริงสองตัวโดยตัวแรกเป็นชื่อไฟล์และตัวที่สองเป็นโหมด

โหมดนี้เป็นสิทธิ์โดยทั่วไปดังนั้นrสำหรับการอ่านwเขียนaเพื่อต่อท้าย คุณยังสามารถรวมเข้าด้วยกันได้rwนั่นหมายความว่าคุณสามารถอ่านและเขียนลงในไฟล์ได้ มีโหมดมากกว่านี้ แต่เป็นโหมดที่ใช้บ่อยที่สุด

หลังจากคุณมีFILEตัวชี้แล้วคุณสามารถใช้คำสั่ง IO เดียวกับที่คุณเคยใช้ยกเว้นว่าคุณต้องนำหน้าด้วยfและอาร์กิวเมนต์แรกจะเป็นตัวชี้ไฟล์ ยกตัวอย่างเช่นprintf's fprintfรุ่นไฟล์

นี่คือโปรแกรมที่เรียกgreetingsว่าอ่าน a จากไฟล์ที่มีรายชื่อและเขียนคำทักทายไปยังไฟล์อื่น:

#include  #include  int main() { // Create file pointers. FILE *names = fopen("names.txt", "r"); FILE *greet = fopen("greet.txt", "w"); // Check that everything is OK. if (!names || !greet) { fprintf(stderr, "File opening failed!\n"); return EXIT_FAILURE; } // Greetings time! char name[20]; // Basically keep on reading untill there's nothing left. while (fscanf(names, "%s\n", name) > 0) { fprintf(greet, "Hello, %s!\n", name); } // When reached the end, print a message to the terminal to inform the user. if (feof(names)) { printf("Greetings are done!\n"); } return EXIT_SUCCESS; }

สมมติว่าnames.txtมีสิ่งต่อไปนี้:

Kamala Logan Carol

จากนั้นหลังจากเรียกใช้greetingsไฟล์greet.txtจะประกอบด้วย:

Hello, Kamala! Hello, Logan! Hello, Carol!