260 likes | 460 Vues
ทำไมต้องเขียนโปรแกรมติดต่อแฟ้มข้อมูล (File). การใช้ตัวแปรและประมวลผลตัวโปรแกรมทั้งหมด จะทำงานอยู่ในหน่วยความจำ (Memory) เท่านั้น นั่นก็หมายความว่าเมื่อโปรแกรมทำงานเสร็จข้อมูลต่าง ๆ ก็จะสูญหายไป
E N D
ทำไมต้องเขียนโปรแกรมติดต่อแฟ้มข้อมูล (File) • การใช้ตัวแปรและประมวลผลตัวโปรแกรมทั้งหมด จะทำงานอยู่ในหน่วยความจำ (Memory) เท่านั้น นั่นก็หมายความว่าเมื่อโปรแกรมทำงานเสร็จข้อมูลต่าง ๆ ก็จะสูญหายไป • ถ้าต้องการให้ข้อมูล (ผลลัพธ์) นั้นยังคงอยู่ เราสามารถทำได้โดยใช้หลักง่าย ๆ คือเขียนข้อมูลผลลัพธ์นั้น เก็บเอาไว้ในไฟล์นั่นเอง • การเขียนโปรแกรมเพื่อติดต่อไฟล์ ยังมีประโยชน์ในกรณีที่เรามีไฟล์ข้อมูล input อยู่แล้ว ต้องการอ่านมันขึ้นมาแล้วประมวลผล แทนที่จะต้องมานั่งคีย์ข้อมูลด้วยตนเองมาก ๆ
ประเภทของไฟล์ • Text File (Sequential Access) (*) เป็นไฟล์ข้อมูล ที่เก็บพวกข้อความ (เปิดอ่านรู้เรื่อง) • Binary File (Random Access) เป็นไฟล์ข้อมูล ที่เก็บเป็น Binary (0/1) ดังนั้นถ้าเราใช้โปรแกรมเช่น Notepad เปิดก็จะอ่านไม่รู้เรื่อง สำหรับไฟล์ข้อมูลในภาษาซีที่ใช้ในการทำงานเพื่อเก็บข้อมูลแบ่งออกเป็น 2 ประเภทคือ
รูปแบบการประกาศใช้งานตัวแปรสำหรับเรื่องการติดต่อไฟล์รูปแบบการประกาศใช้งานตัวแปรสำหรับเรื่องการติดต่อไฟล์ • FILE เป็นประเภทข้อมูล (data type) ที่ใช้งานกับไฟล์ คล้าย ๆ กับ int, char • *fpเป็นชื่อตัวแปร pointer ที่ใช้อ้างอิงพื้นที่การทำงาน FILE *fp; ในภาษาซี ตัวอักษรเล็ก กับ ใหญ่ มีความหมายต่างกัน (Case Sensitive) ซึ่ง FILE เป็น keyword ต้องเขียนด้วยตัวพิมพ์ใหญ่
คำสั่งที่ใช้งานกับไฟล์ข้อมูลคำสั่งที่ใช้งานกับไฟล์ข้อมูล • การเปิดไฟล์ • การปิดไฟล์ • การตรวจสอบว่าในไฟล์ยังมีข้อมูลเหลืออยู่หรือไม่ • การอ่านข้อมูลจาก Text File • การเขียนข้อมูลลง Text File คำสั่งในการทำงานกับไฟล์มีมากมาย แต่ที่เราต้องรู้เพื่อทำงานกับ Text File ที่สำคัญมีดังนี้
เรื่องของ Mode ในการเปิดไฟล์ สำหรับการทำงานกับ Text File เราต้องใส่อักษร “t” เพิ่มเข้าไปใน mode ด้วย (rt, w+t เป็นต้น) สำหรับการทำงานกับ Binary File เราต้องใส่อักษร “b” เพิ่มเข้าไปใน mode ด้วย (wb, a+b เป็นต้น)
การเปิดไฟล์ รูปแบบFILE *fp; fp = fopen(“file name”,“mode”); FILE คือ ประโยคที่ระบุว่าจะมีการใช้ไฟล์ข้อมูล fp คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์ที่เราต้องการ นักศึกษาจะตั้งว่าอะไรก็ได้ fopenคือ คำสั่งสำหรับเปิดไฟล์ file name คือ ให้นักศึกษาระบุชื่อไฟล์พร้อมนามสกุล ที่ต้องการให้ไปเปิด modeคือ ให้นักศึกษาระบุโหมดในการเปิด เนื่องจากในภาษาซีต้องระบุ ด้วยว่าจะให้เปิดเพื่ออะไร เช่น เปิดเพื่ออ่าน, เขียน, เขียนต่อท้าย เป็นต้น
การปิดไฟล์ • fcloseคือ คำสั่งสำหรับปิดไฟล์ • fp คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์นั้น ๆ ใช้คำสั่ง fcloseเมื่อเราใช้งานไฟล์เสร็จ หรือต้องการเปลี่ยน mode fclose(fp);
การตรวจสอบว่ายังมีข้อมูลเหลืออยู่ในไฟล์หรือไม่การตรวจสอบว่ายังมีข้อมูลเหลืออยู่ในไฟล์หรือไม่ • feof คือ คำสั่งตรวจสอบว่ายังมีข้อมูลอยู่ในไฟล์อีกหรือไม่ • fp คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์นั้น ๆ feof(fp);
การอ่านข้อมูลจาก Text File fscanf คล้าย ๆ กับคำสั่ง scanf ที่ทำงานกับ Memory ซึ่งเวลาโปรแกรมทำงาน โปรแกรมก็ยังคงต้องอ่านข้อมูลเข้าไปเก็บใน Memory เช่นเดิม ดังนั้น เมื่อเราใช้คำสั่งอ่านข้อมูลจากไฟล์ จึงต้องมีตัวแปรมารอรับ โดยมีรูปแบบการเขียนคำสั่งคือ • fscanfคือ ที่ใช้อ่านข้อมูลขึ้นมาจากไฟล์ • fp คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์นั้น ๆ • fnameคือ ชื่อตัวแปร ที่เราจะเอาไว้เก็บค่า String โดยจะเก็บ String ไปเรื่อย ๆ จนกว่าจะเจอช่องว่าง (space) • lnameคือ ชื่อตัวแปร ที่เราจะเอาไว้เก็บค่า String ต่อมาที่เจอ fscanf (fp, "%s %s", fname, lname);
การอ่านข้อมูลจาก Text File • คำว่า Janes จะถูกเอาไปเก็บในตัวแปร fname • คำว่า Green จะถูกเอาไปเก็บในตัวแปร lname fscanf (fp, "%s %s", fname, lname); ในกรณีของตัวอย่างนี้นั่นหมายความว่าไฟล์ข้อมูลจะต้องมีลักษณะเป็นดังตัวอย่าง Janes Green สำหรับการอ่านข้อมูลประเภทตัวเลขขึ้นมาคำนวณ ให้อ่านขึ้นมาโดยมองเป็น String ก่อนทั้งหมด เมื่อข้อมูลอยู่ใน Memory แล้วจึงค่อยเปลี่ยนให้มูลให้เป็น int, float หรืออื่น ๆ เพื่อนำไปใช้ต่อไป
การเขียนข้อมูลลง Text File • fprintfคือ ที่ใช้เขียนข้อมูลลงไฟล์ • fp คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์นั้น ๆ • nameคือ ชื่อตัวแปร ที่เก็บ String ที่เราต้องการจะเขียนลงไฟล์ • ageคือ ชื่อตัวแปร ที่เก็บค่าจำนวนเต็ม ที่เราต้องการจะเขียนลงไฟล์ fprintf (fp, "%s %d", name, age);
การเขียนข้อมูลลง Text File fprintf (fp, "%s %d", name, age); ในกรณีของตัวอย่างนี้ ถ้าตัวแปร name เก็บค่า Jenes ส่วนตัวแปร age เก็บค่า 30 นั่นหมายความว่าไฟล์ข้อมูลจะต้องมีลักษณะเป็นดังตัวอย่าง Jenes 30
การเขียนข้อมูลลง Text File สำหรับการเขียนข้อมูลลงไฟล์ ในเรื่องของชนิดของตัวแปรไม่ต้องคำนึงถึง เราสามารถใช้ตัวแปรประเภทต่าง ๆ เช่น int, float, char เขียนลงไฟล์ได้ แต่เมื่อข้อมูลถูกเขียนลงไปแล้ว ทั้งหมดก็จะกลายเป็น Text ซึ่งก็คือ String นั่นเอง ในกรณีที่นักศึกษาต้องการจัดรูปแบบในการเขียนข้อมูลลงไฟล์ ก็สามารถทำได้ เช่น fprintf (fp, "%s\t%d", name, age); กรณีนี้ในไฟล์ก็จะกลายเป็น Jenes 30 *****รูปแบบของข้อมูลไฟล์ ในตอนอ่านด้วย fscanf ก็ควรจะสอดคล้องกันด้วย*****
ไฟล์ข้อมูล (Data File) getc() หรือ fgetc() เป็นฟังก์ชันที่ใช้อ่านข้อมูลทีละ 1 ตัวอักษรจากไฟล์ข้อมูล รูปแบบ getc (fp) เมื่อ fp = ตัวแปรpointer ที่ชี้ไปยังไฟล์ข้อมูล
ไฟล์ข้อมูล (Data File) putc() หรือ fputc() เป็นฟังก์ชันที่ใช้เขียนข้อมูลทีละ 1 ตัวอักษรไปเก็บที่ไฟล์ข้อมูล รูปแบบputc(ch,fp) เมื่อ ch = ตัวแปรที่จะนำข้อมูลไปเก็บไว้ fp = ตัวแปร pointer ที่ชี้ไปยังไฟล์ข้อมูล
ไฟล์ข้อมูล (Data File) fgets() เป็นฟังก์ชันที่ใช้อ่านข้อมูลจากไฟล์ข้อมูลเป็นข้อความ (String) เข้ามาเก็บที่ ตัวแปรอาร์เรย์ หรือจนกว่าจะพบ “\n” หากผิดพลาดจะส่งค่า NULL กลับมา รูปแบบfgets (str,num,fp) เมื่อ str = ตัวแปรอาร์เรย์ที่ใช้เก็บข้อมูล num = จำนวนไบต์ที่ต้องการอ่านข้อมูลต่อครั้ง fp = ตัวแปร pointer ที่ชี้ไปยังไฟล์ข้อมูล
ไฟล์ข้อมูล (Data File) fputs() เป็นฟังก์ชันที่ใช้เก็บข้อมูลลงไฟล์ข้อมูลเป็นข้อความ (String) หากผิดพลาดจะส่งค่า NULL กลับมา รูปแบบfputs (str,fp) เมื่อ str = ตัวแปรอาร์เรย์ที่ใช้เก็บข้อมูล fp = ตัวแปร pointer ที่ชี้ไปยังไฟล์ข้อมูล
ไฟล์ข้อมูล (Data File) fprintf() มีรูปแบบและการทำงานคล้ายกับ printf() เพียงแต่ทำงานกับไฟล์ข้อมูลเท่านั้น รูปแบบfprintf(fp,”control”,argument); เมื่อ fp = ตัวแปร pointer ที่ชี้ไปยังไฟล์ข้อมูล control = รหัสควบคุมการบันทึก argument = ค่าคงที่ ตัวแปร หรือนิพจน์
ไฟล์ข้อมูล (Data File) fprintf() ตัวอย่าง fprintf (fp,”%s %d”,name,salary); เมื่อ fp = ตัวแปร pointer ที่ชี้ไปยังไฟล์ข้อมูล control = ”%s %d” argument = name,salary
ไฟล์ข้อมูล (Data File) fscanf() เป็นฟังก์ชั่นอ่านข้อมูลจากไฟล์ มีรูปแบบและการทำงานคล้ายกับ scanf() เพียงแต่ทำงานกับไฟล์ข้อมูลเท่านั้น รูปแบบ fscanf (fp,”control”,argument); เมื่อ fp = ตัวแปร pointer ที่ชี้ไปยังไฟล์ข้อมูล control = รหัสควบคุมการบันทึก argument = ค่าคงที่ ตัวแปร หรือนิพจน์
ไฟล์ข้อมูล (Data File) fscanf() ตัวอย่างfscanf (fp,”%s %d”,&name,&salary); เมื่อ fp = ตัวแปร pointer ที่ชี้ไปยังไฟล์ข้อมูล control = ”%s %d” argument = &name,&salary
ไฟล์ข้อมูล (Data File) feof() เป็นการตรวจสอบการสิ้นสุดของข้อมูลที่อ่าน ถ้าสิ้นสุดแล้วจะส่งตัวเลขที่ไม่ใช่ 0 กลับมา รูปแบบfeof(fp); เมื่อ fp = ตัวแปร pointer ที่ชี้ไปยังไฟล์ข้อมูล
ไฟล์ข้อมูล (Data File) ferror() เป็นการตรวจสอบการผิดพลาดที่เกิดขึ้นจากการอ่านข้อมูล ถ้าเกิดการผิดพลาดขึ้น จะส่งค่าตัวเลขที่ไม่ใช่ 0 กลับมา รูปแบบ ferror (fp); เมื่อ fp = ตัวแปร pointer ที่ชี้ไปยังไฟล์ข้อมูล
#include <conio.h> #include <stdio.h> void main() { char ch,name[10]; int salary; FILE *fp; clrscr(); fp = fopen("ex1.dat","w"); printf("enter your name "); scanf("%s",name); printf("enter salary "); scanf("%d",&salary); fprintf(fp,"%s %d",name,salary); fclose(fp); }
#include <conio.h> #include <stdio.h> void main() { char ch,name[10]; int salary; FILE *fp; clrscr(); fp = fopen("ex1.dat","a"); printf("enter your name "); scanf("%s",name); printf("enter salary "); scanf("%d",&salary); fprintf(fp,"%s %d",name,salary); fclose(fp); }
#include <conio.h> #include <stdio.h> void main() { char ch,name[10]; int salary; float tax; FILE *fp; clrscr(); fp = fopen("ex1.dat","r"); while(!feof(fp)) { fscanf(fp,"%s %d",&name,&salary); tax = salary*3/100; printf("\n %s %d %d",name,salary,tax); } getch(); fclose(fp); }