File Processing (การประมวลผลแฟ้มข้อม

Download Report

Transcript File Processing (การประมวลผลแฟ้มข้อม

File Processing
(การประมวลผลแฟ้ มข้อมูล)
1
เนือ้ หาทีจ่ ะเรียนรู้
•ทาไมจึงต้องมีการติดต่อแฟ้ มข้อมูล
•ลาดับข้อมูล (Data Hierarchy)
•การเปิ ดและปิ ดแฟ้ มข้อมูล
•การอ่านและเขียนแฟ้ มข้อมูล
•ฟังก์ชนั ที่ใช้เกี่ยวกับการประมวลผลแฟ้ มข้อมูล
2
File Processing by Worawut 2006
ทาไมจึงต้ องมีการติดต่ อแฟ้ มข้ อมูล
• ข้อมูลไม่หายเมื่อโปรแกรมจบการทางาน
• ประมวลผลข้อมูลที่ถูกเก็บในแฟ้ มข้อมูล โดยใช้โปรแกรมคอมพิวเตอร์
• เป็ นการเก็บข้อมูลแบบถาวร อยูใ่ นที่เก็บข้อมูลสารอง (Secondary Storage)
• สามารถนาข้อมูลมาใช้ประโยชน์ได้หลักจากโปรแกรมจบการทางาน
3
File Processing by Worawut 2006
ลาดับของข้ อมูล (data hierarchy)
Bit
ขนาดเล็ก
Byte
Field
Record
File
Database
ขนาดใหญ่
4
File Processing by Worawut 2006
ลาดับของข้ อมูล (ต่ อ)
CMU
1
2
3
KU
4
5
6
CU
7
8
9
CMU
1
2
3
CMU
Field
00100100
1
Bit
File
Record
Byte
5
File Processing by Worawut 2006
การติดต่ อแฟ้ มข้ อมูล ในภาษาซี (C Language)
Stream เป็ นตัวเชื่อมต่อระหว่างแฟ้ มข้อมูลกับโปรแกรม
Stream
File
Program
ข้อมูลจะมีการไหลเข้า-ออกผ่าน Stream
6
File Processing by Worawut 2006
การติดต่ อแฟ้ มข้ อมูล ในภาษาซี (C Language)
Text files
ไฟล์ที่เก็บตัวอักษร, string โดยใช้
ASCII
File
Binary files
ไฟล์ ทเี่ ก็บข้ อมูลเฉพาะซึ่งผ่ านการเข้ ารหัส
ทีเ่ ฉพาะเจาะจงแตกต่ างกัน
7
File Processing by Worawut 2006
การติดต่ อแฟ้ มข้ อมูล ในภาษาซี (C Language)
ในการติดต่อกับแฟ้ มข้อมูล Stream จะถูกแทนด้วย ตัวแปรชี้แฟ้ มข้อมูล
(file pointer) ที่ถูกกาหนดเป็ นโครงสร้างข้อมูลชนิด FILE
*ptr_Data
file pointer
Program
File
ตัวแปรชี้แฟ้ มข้อมูล มีสัญลักษณ์ * นาหน้าชื่อตัวแปร เช่น *ptr_Data
EX.
FILE *ptr_Data;
8
File Processing by Worawut 2006
การเปิ ดและปิ ดแฟ้ มข้ อมูล
• แฟ้ มข้อมูลที่ทาการศึกษานี้ เป็ นชนิดแฟ้ มข้อความ (text file)
• การใช้งานแฟ้ มข้อมูลต้องประกาศ Header Program
#include < stdio.h>
•ตัวแปรที่เกี่ยวกับแฟ้ มข้อมูลใช้โครงสร้างข้อมูลชนิ ด FILE
จะมีการใช้ตวั ชี้แฟ้ มข้อมูล (pointer:พอยเตอร์ มี * นาหน้าชื่อตัวแปร) เพื่อ
อ้างอิงถึงพื้นที่ดิกส์ที่เก็บแฟ้ มข้อมูล
FILE *ชื่อตัวแปรชี้แฟ้ มข้อมูล;
EX. FILE *ptrData;
9
File Processing by Worawut 2006
การเปิ ดและปิ ดแฟ้ มข้ อมูล (ต่ อ)
• การเปิ ดแฟ้มข้ อมูล ใช้ฟังก์ชนั fopen();
ใช้สาหรับเปิ ดแฟ้ มข้อมูลเพื่ออ่านหรื อเขียนข้อมูล
syntax:
ตัวชี้แฟ้ ม = fopen(“ชื่อแฟ้ มข้อมูล”,mode);
# เงื่อนไขการคืนค่าของฟังก์ชนั fopen()
if openfile complete
return address
if openfile not complete !!
return NULL
EX.
ptrData = fopen(“c:\\student.txt”, “r”);
10
File Processing by Worawut 2006
การเปิ ดและปิ ดแฟ้ มข้ อมูล (ต่ อ)
เมือ่ เปิ ดแฟ้มได้ สมบูรณ์
11
File Processing by Worawut 2006
การเปิ ดและปิ ดแฟ้ มข้ อมูล (ต่ อ)
• การปิ ดแฟ้มข้ อมูล ใช้ฟังก์ชนั fclose();
ใช้สาหรับปิ ดแฟ้ มข้อมูล ไม่มีการใช้งานแฟ้ มข้อมูลแล้ว ตัวชี้เลิกการชี้แฟ้ มข้อมูล
ส่ งข้อมูลที่คา้ งใน stream ลงแฟ้ มข้อมูล
syntax:
fclose(ตัวชี้แฟ้ ม);
# เงื่อนไขการคืนค่าของฟังก์ชนั fclose()
if close file complete
return 0
EX.
fclose(ptrData);
12
File Processing by Worawut 2006
การเปิ ดและปิ ดแฟ้ มข้ อมูล (ต่ อ)
• mode ของการเปิ ดแฟ้มข้ อมูล (**สาหรับแฟ้มชนิดข้ อความ ใช้ งานบ่ อยมาก)
mode
ความหมาย
“r”
อ่านอย่างเดียว (read) ถ้าไม่มีแฟ้ มอยูจ่ ะเปิ ดไม่ได้
“w”
เปิ ดแฟ้ มใหม่เขียนอย่างเดียว (write) ถ้าไม่มีแฟ้ มอยูจ่ ะสร้างแฟ้ มใหม่
“a”
เขียนต่อท้าย (update) ถ้าไม่มีแฟ้ มอยูจ่ ะสร้างแฟ้ มใหม่
“r+”
อ่านและเขียน (read/write) ถ้าไม่มีแฟ้ มอยูจ่ ะเปิ ดไม่ได้
“w+”
เปิ ดแฟ้ มใหม่อ่านและเขียน ถ้าไม่มีแฟ้ มอยูจ่ ะสร้างแฟ้ มใหม่
“a+”
อ่านและเขียนต่อท้าย (read/update) ถ้าไม่มีแฟ้ มอยูจ่ ะสร้างใหม่
13
File Processing by Worawut 2006
การเปิ ดและปิ ดแฟ้ มข้ อมูล (ต่ อ)
EX.
#include<stdio.h>
void main()
{ FILE *ptrData;
ประกาศตัวแปรชี้แฟ้มข้ อมูลเป็ นชนิด FILE
เปิ ดแฟ้ม student.txt เพือ่ อ่ านข้ อมูล
mode “r” อ่ านอย่ างเดียว
if((ptrData = fopen(“c:\\student.txt”,”r”)) != NULL)
{ printf(“Open file Complete !!”);
fclose(ptrData);
ปิ ดแฟ้มข้ อมูล ไม่ ใช้ งานแล้ว
}
else
printf(“Can not Open file”);
}
14
File Processing by Worawut 2006
การอ่ านและเขียนแฟ้ มข้ อมูลแบบ Sequential Access
เมื่อสามารถเปิ ดแฟ้ มข้ อมูลสาเร็ จแล้ ว
- สามารถนาข้อมูลในแฟ้ มออกมาใช้งาน หรื อเขียนข้อมูลไปยังแฟ้ ม
• ฟังก์ชนั ในการอ่าน/เขียนแฟ้ มข้อมูล คล้ายกันกับฟังก์ชนั ที่เคยเรี ยนรู ้
scanf( ); // รับค่าจากคียบ์ อร์ด (Standard input)
printf( ); // ส่ งค่าที่ตอ้ งการแสดงผลออกหน้าจอ (Standard Output)
• ฟังก์ชนั สาหรับอ่าน/เขียนแฟ้ มข้อมูลจะมี f นาหน้าชื่อฟังก์ชนั
15
File Processing by Worawut 2006
การอ่ านและเขียนแฟ้ มข้ อมูล (ต่ อ)
• ฟังก์ชันทีใ่ ช้ ในการอ่านข้ อมูลในแฟ้ม
fscanf();
เป็ นฟังก์ชันสาเร็จรูป
(อยู่ใน library ชื่อ stdio.h)
•ฟังก์ชันที่ใช้ ในการเขียนข้ อมูลไปยังแฟ้ม
fprintf();
เป็ นฟังก์ชันสาเร็จรูป
(อยู่ใน library ชื่อ stdio.h)
16
File Processing by Worawut 2006
การอ่ านข้ อมูลในแฟ้ มแบบ Sequential Access
• การอ่ านข้ อมูลในแฟ้ม โดยใช้ ฟังก์ชัน fscanf();
- คล้ายการทางานของฟังก์ชัน scanf()
- อ่ านข้ อมูลจากแฟ้มทีละ 1 ค่ าโดยจัดรู ปแบบข้ อมูลให้ อยู่ในชนิดที่ต้องการได้
Syntax:
fscanf(ตัวชี้แฟ้ม,“รู ปแบบข้ อมูล”, &ตัวแปร);
เช่ น
fscanf(ptrData,“%c%d%d”,&ch,&num1,&num2);
ตัวชี้แฟ้ม
รู ปแบบข้ อมูล
&ตัวแปร
17
File Processing by Worawut 2006
การอ่ านข้ อมูลในแฟ้ มแบบ Sequential Access
• EX. การอ่ านข้ อมูลในแฟ้ม โดยใช้ ฟังก์ชัน fscanf();
#include <stdio.h>
void main()
{ FILE *ptrData;
char ch; int num;
ptrData=fopen("c:\\code.txt",“r");
if (ptrData != NULL)
{ while(feof(ptrData) ==0)
{
fscanf(ptrData,"%c%d",&ch,&num);
if (ch=='c') printf("your room is %c%d",ch,num);
}
}
else printf(“Open file Error”);
fclose(ptrData);
}
18
File Processing by Worawut 2006
การอ่ านข้ อมูลในแฟ้ มแบบ Sequential Access
code.txt
*ptrData
E25
C11
F30
program
ผลลัพธ์
หน้ าจอ
%c
%d
your room is C11
fscanf(ptrData,"%c%d",&ch,&num);
19
File Processing by Worawut 2006
การเขียนข้ อมูลลงแฟ้ มแบบ
ม Sequential Access
• การเขียนข้ อมูลลงแฟ้ม โดยใช้ ฟังก์ชัน fprintf();
- การทางานคล้ ายฟังก์ชัน printf();
- เขียนข้ อมูลลงแฟ้มโดยจัดรู ปแบบของข้ อความและข้ อมูลให้ อยู่ในชนิดที่ต้องการได้
Syntax:
fprintf(ตัวชี้แฟ้ม,“รู ปแบบข้ อความและข้ อมูล”, ตัวแปรหรือข้ อมูล);
เช่ น
fprintf(ptrData,“N’ MaM is %d years old”,23);
ตัวชี้แฟ้ม
รู ปแบบข้ อความและข้ อมูล
ข้ อมูล
20
File Processing by Worawut 2006
การเขียนข้ อมูลลงแฟ้ มแบบ
ม Sequential Access
• EX. การเขียนข้ อมูลลงแฟ้ม โดยใช้ ฟังก์ชัน fprintf();
#include <stdio.h>
void main()
{ FILE *ptrData;
ptrData=fopen("c:\\print_t.txt","w");
if (ptrData != NULL)
fprintf(ptrData,"Hello Computer Olympic camp %d",1);
else
printf(“Open file Error”);
fclose(ptrData);
}
21
File Processing by Worawut 2006
การเขียนข้ อมูลลงแฟ้ มแบบ
ม Sequential Access
fprintf(ptrData,"Hello Computer Olympic camp %d",1);
print_t.txt
Hello Computer Olympic Camp 1
22
File Processing by Worawut 2006
การตรวจสอบการอ่ าน/เขียน แฟ้ มข้ อมูล
• ที่ผา่ นมา ยังไม่ได้ตรวจสอบแฟ้ มข้อมูลก่อนการอ่าน/ก่อนการเขียน
อาจทาให้ โปรแกรมทางานผิดพลาดได้ !!!
• ฟังก์ชันสาหรับการตรวจสอบก่อนการอ่าน/เขียน แฟ้มข้ อมูล ได้ แก่
feof();
• ตรวจสอบจุดสิ้ นสุ ดของแฟ้ มข้อมูล
• บางทีจะใช้ตวั แปรเฉพาะ EOF (End Of File) นามา
ตรวจสอบจุด สิ้ นสุ ดของแฟ้ มข้อมูล
23
File Processing by Worawut 2006
การตรวจสอบการอ่ าน/เขียน แฟ้ มข้ อมูล
• การใช้ งานฟังก์ชัน feof()
syntax:
retvalue = feof(ตัวชี้แฟ้ม);
retvalue คือ ตัวแปรทีร่ ับค่ าที่ส่งกลับมาจากฟังก์ชัน feof
ค่าตัวแปรที่ส่งกลับมา มีความหมาย 2 แบบ ดังนี้
1. ถ้า rtvalue = 0 คือ ตัวชี้ยงั ไม่ถึงจุดสิ้ นสุ ดของแฟ้ ม (not EOF)
2. ถ้า rtvalue > 0 คือ ตัวชี้ถึงจุดสิ้ นสุ ดของแฟ้ ม (EOF)
** rtvalue > 0 เป็ นตัวเลขอื่นๆ ได้ ต้องระวังในการตรวจสอบ
24
File Processing by Worawut 2006
การตรวจสอบการอ่ าน/เขียน แฟ้ มข้ อมูล
• Ex. การใช้งาน ฟังก์ชนั feof();
#include <stdio.h>
void main()
{ FILE *ptrSource;
FILE *ptrTarget;
char c;
if((ptrSource=fopen("Source.dat","r")) != NULL)
{
if((ptrTarget=fopen("Target.dat","w")) != NULL)
{
while(!feof(ptrSource)) /* check End Of Source File */
{ fscanf(ptrSource,”%c”,&c);
if(ferror(ptrSource)!= 0) /* check write data */
{ printf("Error Read data from source file\n");
return();
}
25
File Processing by Worawut 2006
fprintf(ptrTarget,”%c”,c); /* write to target file */
if(ferror(ptrTarget)!= 0) /* check write data */
{ printf("Error Writing to Target file\n");
return();
}
} /* end while */
} /* end if open Target file */
else
printf("Can't open Target file");
} /* end if open Source file */
else
printf("Can't open Source file");
fclose(ptrSource);
fclose(ptrTarget);
} /* end main */
26
File Processing by Worawut 2006
การตรวจสอบการอ่ าน/เขียน แฟ้ มข้ อมูล
• จากตัวอย่างโปรแกรมทีใ่ ห้ พจิ ารณา คือโปรแกรมอะไร ???
Source.dat
Abcdefg1234
fscanf(ptrSource,”%c”,&c);
คัดลอกแฟ้มข้ อมูล
Target.dat
Abcdefg1234
fprintf(ptrTarget,”%c”,c);
27
File Processing by Worawut 2006
เทคนิคเกีย่ วการแก้ปัญหาและปัญหาที่พบบ่ อย
• การเปิ ดไฟล์ จากไดเรกเตอรีและไดรฟ์ ทีต่ ้ องการ เช่น ไดร์ฟ A:
- ต้องใช้สัญลักษณ์ \\ เพื่อระบุถึง path ที่อยูข่ องแฟ้ มที่ตอ้ งการ
เช่น ต้องการเปิ ดแฟ้ มที่ A:\data\student.txt
ในโปรแกรม-> fopen(“A:\\data\\student.txt”,“mode”);
28
File Processing by Worawut 2006
สรุป เนือ้ หาเรื่อง File
• การประมวลผลแฟ้มข้ อมูล เป็ นลักษณะ Sequential Access
• คาสั่ งทีใ่ ช้ จะใช้ กบั แฟ้มข้ อมูลชนิด text
• เมือ่ ทาการเปิ ดแฟ้ม ตัวชี้แฟ้มจะเริ่มต้ นทีจ่ ุดเริ่มต้ นของข้ อมูลในแฟ้มเสมอ
29
File Processing by Worawut 2006
การบ้ าน
• กาหนดให้ ในแฟ้มข้ อมูล num.data มีข้อมูลดังภาพ
1
4
2
8
14
15
40
57
32
84
91
57
5
7
100
จงเขียนโปรแกรมเพือ่ หาผลรวม ของข้ อมูลจากแฟ้ม num.data แล้ว
แสดงผลออกหน้ าจอและบันทึกผลลัพธ์ ที่แฟ้ม num_out.data
30
File Processing by Worawut 2006
การบ้ าน
• จงเขียนโปรแกรมรับข้ อมูลชื่อและอายุ ของนักศึกษาจานวน 5 คนและบันทึกลง
แฟ้มข้ อมูลชื่อ friends.data ดังภาพ
Somchai 15
Devil
14
Satan
20
Rungtip
16
จากนั้น จงเขียนโปรแกรมอ่ านข้ อมูลจากแฟ้มข้ อมูลข้ างต้ น และแสดงผลทาง
จอภาพ
31
File Processing by Worawut 2006
การบ้ าน
• จากแฟ้มข้ อมูล friends.data เก็บข้ อมูลชื่อและอายุ ดังภาพ
Somchai 15
Devil
14
Satan
20
Rungtip
16
จงเขียนโปรแกรมค้ นหาชื่อของเพือ่ นทีต่ ้ องการ ถ้ าพบข้ อมูลตรงกับที่ต้องการ
ค้ นหาให้ แสดงชื่อและอายุของเพือ่ นทางจอภาพ (ใช้ strcmp() ในการ
เปรียบเทียบ string)
32
File Processing by Worawut 2006