บทที่ 8 การเขียนโปรแกรมติดต่อแฟ้มข้อมูล

Download Report

Transcript บทที่ 8 การเขียนโปรแกรมติดต่อแฟ้มข้อมูล

ทำไมต้ องเขียนโปรแกรมติดต่ อ
แฟ้มข้ อมูล (File)



กำรใช้ ตัวแปรและประมวลผลตัวโปรแกรมทั้งหมด จะทำงำนอยู่
ในหน่ วยควำมจำ (Memory) เท่ ำนั้น นั่นก็หมำยควำมว่ ำเมื่อ
โปรแกรมทำงำนเสร็จข้ อมูลต่ ำง ๆ ก็จะสู ญหำยไป
ถ้ ำต้ องกำรให้ ข้อมูล (ผลลัพธ์ ) นั้นยังคงอยู่ เรำสำมำรถทำได้ โดย
ใช้ หลักง่ ำย ๆ คือเขียนข้ อมูลผลลัพธ์ น้ัน เก็บเอำไว้ ในไฟล์นั่นเอง
กำรเขียนโปรแกรมเพือ่ ติดต่ อไฟล์ ยังมีประโยชน์ ในกรณีที่เรำมี
ไฟล์ข้อมูล input อยู่แล้ว ต้ องกำรอ่ำนมันขึน้ มำแล้ วประมวลผล
แทนทีจ่ ะต้ องมำนั่งคีย์ข้อมูลด้ วยตนเองมำก ๆ
ประเภทของไฟล์
สำหรับไฟล์ ข้อมูลในภำษำซีทใี่ ช้ ในกำรทำงำนเพือ่ เก็บข้ อมูลแบ่ งออกเป็ น 2 ประเภทคือ

Text File (Sequential Access) (*)
เป็ นไฟล์ขอ้ มูล ที่เก็บพวกข้อความ (เปิ ดอ่านรู ้เรื่ อง)

Binary File (Random Access)
เป็ นไฟล์ขอ้ มูล ที่เก็บเป็ น Binary (0/1) ดังนั้นถ้าเราใช้โปรแกรมเช่น
Notepad เปิ ดก็จะอ่านไม่รู้เรื่ อง
รูปแบบกำรประกำศใช้ งำนตัวแปร
สำหรับเรื่องกำรติดต่ อไฟล์
FILE *fp;


FILE
*fp
เป็ นประเภทข้ อมูล (data type) ทีใ่ ช้ งำนกับไฟล์ คล้ำย ๆ กับ int, char
เป็ นชื่อตัวแปร pointer ทีใ่ ช้ อ้ำงอิงพืน้ ที่กำรทำงำน
ในภำษำซี ตัวอักษรเล็ก กับ ใหญ่ มีควำมหมำยต่ ำงกัน (Case Sensitive) ซึ่ง FILE เป็ น
keyword ต้ องเขียนด้ วยตัวพิมพ์ใหญ่
คำสั่ งที่ใช้ งำนกับไฟล์ ข้อมูล
คำสั่ งในกำรทำงำนกับไฟล์ มมี ำกมำย แต่ ทเี่ รำต้ องรู้ เพือ่ ทำงำนกับ Text File ทีส่ ำคัญมีดังนี้





กำรเปิ ดไฟล์
กำรปิ ดไฟล์
กำรตรวจสอบว่ ำในไฟล์ยงั มีข้อมูลเหลืออยู่หรือไม่
กำรอ่ำนข้ อมูลจำก Text File
กำรเขียนข้ อมูลลง Text File
เรื่องของ Mode ในกำรเปิ ดไฟล์
คำอธิบำย
Mode
r
w
a
r+
w+
a+
เปิ ดไฟล์ เพื่ออ่านเท่านั้น
เป็ นการสร้างไฟล์ใหม่ ถ้าหากไฟล์น้ นั มีอยูแ่ ล้วจะถูกสร้างทับทันที (overwritten)
การเปิ ดไฟล์ เพื่อบันทึกข้อมูลต่อท้ายข้อมูลเดิม, หรื อเป็ นการสร้างไฟล์ ถ้าไฟล์น้ นั ยังไม่มีอยู่
เปิ ดไฟล์ เพื่ออ่านและปรับปรุ งแก้ไข
เป็ นการสร้างไฟล์ใหม่ และบันทึกข้อมูล ถ้าหากไฟล์น้ นั มีอยูแ่ ล้วจะถูกสร้างทับทันที
การเปิ ดไฟล์ เพื่อบันทึกข้อมูลต่อท้ายข้อมูลเดิม,เปิ ดไฟล์ เพื่ออ่านและปรับปรุ งแก้ไขข้อมูลที่
ท้ายสุ ดของไฟล์,เป็ นการสร้างไฟล์ ถ้าไฟล์น้ นั ยังไม่มีอยู่
สำหรับกำรทำงำนกับ 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 เมื่อเรำใช้ งำนไฟล์เสร็จ หรือต้ องกำรเปลีย่ น mode
fclose(fp);

fclose
คือ คำสั่ งสำหรับปิ ดไฟล์

fp
คือ ชื่อตัวแปร pointer ที่จะชี้ไปหำไฟล์ น้ัน ๆ
กำรตรวจสอบว่ ำยังมีข้อมูลเหลืออยู่ในไฟล์ หรือไม่
feof(fp);


feof
fp
คือ คำสั่ งตรวจสอบว่ ำยังมีข้อมูลอยู่ในไฟล์ อกี หรือไม่
คือ ชื่อตัวแปร pointer ที่จะชี้ไปหำไฟล์ น้ัน ๆ
กำรอ่ ำนข้ อมูลจำก Text File
fscanf คล้ ำย ๆ กับคำสั่ ง scanf ทีท่ ำงำนกับ Memory ซึ่งเวลำโปรแกรมทำงำน โปรแกรมก็ยังคงต้ อง
อ่ ำนข้ อมูลเข้ ำไปเก็บใน Memory เช่ นเดิม ดังนั้น เมือ่ เรำใช้ คำสั่ งอ่ ำนข้ อมูลจำกไฟล์ จึงต้ องมีตัวแปรมำรอรับ
โดยมีรูปแบบกำรเขียนคำสั่ งคือ
fscanf (fp, "%s %s", fname, lname);

fscanf
fp
fname

lname


คือ ที่ใช้อ่านข้อมูลขึ้นมาจากไฟล์
คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์น้ นั ๆ
คือ ชื่อตัวแปร ที่เราจะเอาไว้เก็บค่า String โดยจะเก็บ String
ไปเรื่ อย ๆ จนกว่าจะเจอช่องว่าง (space)
คือ ชื่อตัวแปร ที่เราจะเอาไว้เก็บค่า String ต่อมาที่เจอ
กำรอ่ ำนข้ อมูลจำก Text File
fscanf (fp, "%s %s", fname, lname);
ในกรณีของตัวอย่ ำงนีน้ ั่นหมำยควำมว่ ำไฟล์ ข้อมูลจะต้ องมีลกั ษณะเป็ นดังตัวอย่ ำง
Janes Green


คำว่ ำ Janes จะถูกเอำไปเก็บในตัวแปร fname
คำว่ ำ Green จะถูกเอำไปเก็บในตัวแปร lname
สำหรับกำรอ่ ำนข้ อมูลประเภทตัวเลขขึน้ มำคำนวณ ให้ อ่ำนขึน้ มำโดยมองเป็ น String ก่ อนทั้งหมด
เมือ่ ข้ อมูลอยู่ใน Memory แล้ วจึงค่ อยเปลีย่ นให้ มูลให้ เป็ น int, float หรืออืน่ ๆ เพือ่ นำไปใช้ ต่อไป
กำรเขียนข้ อมูลลง Text File
fprintf (fp, "%s %d", name, age);




fprintf
fp
name
age
คือ ที่ใช้เขียนข้อมูลลงไฟล์
คือ ชื่อตัวแปร pointer ที่จะชี้ไปหาไฟล์น้ นั ๆ
คือ ชื่อตัวแปร ที่เก็บ String ที่เราต้องการจะเขียนลงไฟล์
คือ ชื่อตัวแปร ที่เก็บค่าจานวนเต็ม ที่เราต้องการจะเขียนลงไฟล์
กำรเขียนข้ อมูลลง 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 ที่ช้ ีไปยังไฟล์ขอ้ มูล
fgets()
ไฟล์ ข้อมูล (Data File)
เป็ นฟังก์ชนั ที่ใช้อ่านข้อมูลจากไฟล์ขอ้ มูลเป็ นข้อความ (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);
}