วิชา การพัฒนาโปรแกรม...
TRANSCRIPT
0
วชา การพฒนาโปรแกรม (ภาษาซ) รหสวชา ว31293
หนวยการเรยนรท 10 การจดการไฟล
ผลการเรยนร
มความรความเขาใจในการท างานประมวลผลขอมลรวมกบไฟลขอมลชนดเทกซไฟลและไฟลแบบไบนารไดน าไปประยกตใชงานในการเขยนโปรแกรมภาษาซได
จดประสงคการเรยนร
1. อธบายความหมายของไฟลได 2. อธบายขบวนการประมวลผลกบไฟลได 3. เขาใจเกยวกบไฟลแบบเทกซไฟลและไฟลแบบไบนารไฟล 4. สามารถเขยนโปรแกรมเปดและปดไฟลได 5. สามารถเขยนโปรแกรมเพอเกบขอมลเปนไฟลได
สาระการเรยนร 1. ประเภทของไฟล 2. การท างานกบเทกไฟล 3. การใชค าสงท างานขอมลกบเทกซไฟล
1
ใบความรท 10 เรอง การจดการไฟล
จดท าโดย นางพรพนารตน ชมภนช
ในงานบางประเภท จะตองน าผลการท างานของโปรแกรมเกบลงในหนวยความจ าส ารอง ลกษณะของขอมลทเกบในหนวยความจ าส ารองนจะเกบเปนไฟล ซงไฟลในภาษาซมอยหลายประเภท แตละประเภทมค าสงในการอานเขยนไฟลตางกน ดงนนถาหากตองการเขยนขอมลเปนไฟลจะตองท าความเขาใจฟงกชนทกระท ากบไฟลดวย
ประเภทของไฟล
ในบทนจะกลาวถงลกษณะของไฟลหรอแฟมขอมล และการเขยนโปรแกรมและอานไฟลกบหนวยความจ าส ารองทใชเกบขอมลเวลาปดเครองคอมพวเตอร หนวยความจ านขอมลจะไมหาย เชน ฮารดไดรฟ หรอซดรอม กอนทจะศกษาเรองไฟลจะตองเขาใจกค าวา สตรม (stream) เสยกอน
สตรม (stream) เปนหนวยของขอมลท
เ ร ยง ตดกน โดยขอ มลแ ตละหนวยอาจ เ ปนโครงสรางหรอขอมลชนดเดยวกนกได สวนไฟลจะเปนจดทใชตดตอกบสตรมเพอรบหรอสงขอมลกได
สตรมแบบตามลกษณะขอมลจะแบงออกเปน 2 ประเภท คอ
1. สตรมเทกซ (text stream) หรอ เทกซไฟล (text file) 2. สตรมไบนาร (binary stream) หรอ ไบนารไฟล (binary file)
1. สตรมเทกซ (text stream) เปนไฟลทจดเกบขอความ ซงมคณลกษณะทส าคญคอ จะบนทกขอมลทเปนขอความตาง ๆ ตามรหสแอสกของแตละตวอกขระ ดงนน สตรมเทกซ หรอเทกซไฟลจงสามารถถกเปดอานดวยโปรแกรม Notepad และสามารถอานขอความทบนทกไวอยางเขาใจ อยางไรกตาม ส าหรบเรคคอรดทถกบนทกลงในเทกซไฟลนน ในแตละเรคคอรดจะตองถกปดทายดวยรหสปดขนบรรทดใหม (\n) ดวยเพอใหรบรวา แตละบรรทดจะเปนขอมลของเรคคอรดนน ๆ
Stream คอ....
2
2. สตรมไบนาร(binary stream) เปนแฟมขอมลทจดเหบขอมลชนดเลขฐานสอง ดงนน สตรมไบนารหรอไบนารไฟล เมอถกเปดดวยโปรแกรม notepad แลว จะเปนรหสขอมลตาง ๆ ทเราไมสามารถอานได เนองจากเปนภาษาเครองหรอเลขฐาน 2 นนเอง
และสงส าคญของไฟลทง 2 ลกษณะทเกบขอมลทง 2 แบบนน ขอมลแตละไบตจะถกเกบเรยงกนไปและจบทายดวยรหส EOF (End of File)
การท างานกบเทกไฟล
1. ตวแปรพอยนเตอร
ในการเขยนโปรแกรมเพอสรางหรอานไฟลกบแผjนดสกหรอหนวยความจ าส ารอง จะตองใชตวแปรตวหนงทมชอวา ไฟลพอยนเตอร (File Pointer) ตวแปรตวนจะบอกวาต าแหนงทเราก าลงจะด าเนนการอยนอยทต าแหนงใดของไฟล เชน ตนไฟล กลางไฟล หรอทายไฟล ถาหากไมมตวแปรไฟลพอยนเตอรเราจะไมสามารถกระท าการใด ๆ กบไฟลได
รปแบบค าสง การประกาศเพอก าหนดตวแปรท าหนาทเปนไฟลพอยนเตอร
File *ชอตวแปรไฟลพอยนเตอร
2. การเปดไฟล
การเปดไฟลบนแผนดสกหรอหนวยความจ าส ารอง จะใชฟงกชน fopen( ) อยใน เฮดเดอรไฟลทชอ stdio.h โดยมรปแบบการใชงานค าสง ดงน
ตวแปรไฟล = fopen(“ชอไฟล”, “รปแบบการเปดไฟล”);
โดยจะเปดไฟลตามทก าหนดไวในชอไฟลซงอาจเปนชอไฟลคงทหรอเปนตวแปรสตรงกได โดยสามารถระบไดรฟทเกบขอมลลงไปดวยกได สวนรปแบบการเปดไฟลจะเปนตวบอกวาไฟลทเปดนนเราตองการท าอะไร โดยมรปแบบดงตารางตอไปน
3
โหมด การท างาน r เปดเทกซไฟลเพออาน w สรางเทกซไฟลใหมเพอเขยน a เปดเทกซไฟลเพอเขยนขอมลตอทาย rb เปดไบนารไฟลเพออาน wb สรางไบนารเพอเขยน ab สรางไบนารเพอเขยนขอมลตอทาย r+ เปดเทกไฟลเพออานหรอเขยนทบไฟลเกา w+ เปดเทกซไฟลเพออานหรอเขยนทบไฟลเกา a+ เปดเทกซไฟลเพอตอทายไฟลเกา หรอเขยนไฟลใหม r+b เปดไบนารไฟลเพออานหรอเขยนทบไฟลเกา w+b เปดไบนารไฟลเพออานหรอเขยนทบไฟลเกา หรอไฟลใหม a+b เปดไบนารไฟลเพอเขยนตอทายไฟลเกา หรอเขยนไฟลใหม
ตวอยางท 1
ft=fopen(“data.txt” , “w”)
หมายถง เปดไฟลชอ data.txt เพอการเขยน ถาหากในหนวยความจ าส ารองไมมไฟลชอน กจะเปนการสรางไฟลนขนมาใหม แตถามไฟลอยแลวกจะถกเขยนทบ
ตวอยางท 2
ft=fopen(“d:\\data.txt” , “w”)
หมายถง เปดไฟลชอ data.txt เพอการเขยนทอยไดรฟ D ถาหากในหนวยความจ าส ารองไมมไฟลชอน กจะเปนการสรางไฟลนขนมาใหม แตถามไฟลอยแลวกจะถกเขยนทบ
4
ตวอยางท 3
ft=fopen(“data.txt” , “a+”)
หมายถง เปดไฟลชอ data.txt เพอการเขยนขอมลเพมทายไฟลเกา ถาหากไมมไฟลอยกจะเปนการสรางไฟลขนมาใหม
ตวอยางท 4
ft=fopen(“data.txt” , “r”)
หมายถง เปดไฟลชอ data.txt เพออานขอมล ถาหากไมมไฟลอยจะเกดขอผดพลาดขน
ถาไฟลนนเปดไดจะมการสงคาชขอมลไฟล (file pointer) แตถาไฟลนนไมสามารถเปดไดจะมการสงคา NULL กลบออกมา ดงนนเมอมการเปดไฟลดวยค าสง fopen() จะตองมการตรวจสอบกอนทจะด าเนนการตอไปวาไฟลนนเปดไดหรอไม ดงตวอยางโคดดงตอไปน ในการเปดไฟลหากตวแปร ft มคาเทากบ NULL แสดงวาการเปดไฟลไมส าเรจ ดงนนหากมกรณทเกด Error ขนเกยวกบการเปดไฟลหรอการท างานแลวตองการใหโปรแกรมออกจาการท างานใหใชค าสง exit( ) ไดดงน 1) หากตองการโปรแกรมจบการท างานในกรณทโปรแกรมท างานสมบรณ แลวตองการออกจากโปรแกรมใหใชค าสง exit(0) เพอท าการออกจากโปรแกรม 2) หากตองการโปรแกรมจบการท างานในกรณทโปรแกรมท างานไมสมบรณ แลวตองการออกจากโปรแกรมใหใชค าสง exit(1) เพอท าการออกจากโปรแกรม 3. การปดไฟล
หลงจากไฟลนนเปดไดและด าเนนการตาง ๆ กบไฟลไปแลว จะตองปดไฟล เพอปองกนขอมลสญหาย โดยใชฟงกชน fclose() โดยมรปแบบดงน รปแบบท 1
int fclose(FILE *ชอตวแปรไฟลพอยนเตอร)
5
รปแบบท 2
fclose(ชอตวแปรไฟลพอยนเตอร)
เมอระบบสามารถปดไฟลทตวแปรไฟลพอยนเตอรชอยจะคนคา 0 คนออกมานนเอง
ตวอยางท 1 int fclose(FILE *ft)
หรอ fclose(ft)
หมายถง ปดไฟลทตวแปรไฟลพอยนเตอรชอ ft ชต าแหนงอย
กจกรรมเสรมทกษะ
ใหนกเรยนทดลองเขยนโปรแกรมทมการแสดงการเปดไฟลในโหมด “w” และใหบนทกไฟลชอ ex10_1.cpp
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
#include <stdio.h> #include <conio.h> #include <stdlib.h> main() { FILE *fp; fp=fopen("data.txt","w"); if (ft==NULL) { printf("Cannot open DATA.TXT\n"); exit(1); } else { printf("Can open DATA.TXT\n"); } fclose(fp); getch(); }
รปภาพ แสดงผลลพธทไดจากการท างานของ
โปรแกรม ex10_1.exe
6
การใชค าสงท างานขอมลกบเทกซไฟล 1. การใชฟงกชน fprintf( )
การใชฟงกชน fprintf ( ) เหมอนกบฟงกชน printf ( )ตรงทน าขอมลมาแสดงผล แตตางกนทการน าขอมลไปแสดงผลลงไฟล (บนทก) หรอหนาจอนนเอง โดยมรปแบบการใชงานฟงกชน fprintf ( ) ดงน รปแบบ
fprintf(ชอตวแปรไฟลพอยนเตอร, “รปแบบชนดขอมล” , ชอตวแปร );
ตวอยางท 1
fprintf (fp , ”%d” , age);
หมายถง การน าคาจากตวแปรทชอ age ไปแสดงผลหรอบนทกลงในไฟลทตวแปร ไฟลพอยนเตอรทชอ fp ชต าแหนงอย
ตวอยางท 2
fprintf (fp , “%s %d %c ” , name , age , sex);
หมายถง การน าคาจากตวแปรทชอ name , age และ sex ไปแสดงผลหรอบนทกลงในไฟล ทตวแปรไฟลพอยนเตอรทชอ fp ชต าแหนงอย
2. การใชฟงกชน fscanf( )
การใชฟงกชน fscanf( ) เหมอนกบฟงกชน scanf ( )ตรงทเปนการรบขอมล แตตางกนทการรบขอมลจากไฟลหรอคยบอรดนนเอง โดยมรปแบบการใชงานฟงกชน fscanf( ) ดงน รปแบบ
fscanf(ชอตวแปรไฟลพอยนเตอร, “รปแบบการแสดงผล” , ชอตวแปร );
7
ตวอยางท 1
fscanf(fp , ”%d” , &age);
หมายถง การรบคาจากไฟลทไฟลพอยนเตอรชอ fp ชต าแหนงอยมาเกบไวในตวแปร ทชอ age จาก
ตวอยางท 2
fscanf(fp , “%d %c ” , &age , &sex);
หมายถง การรบคาจากไฟลทไฟลพอยนเตอรชอ fp ชต าแหนงอย มาเกบไวทตวแปร ทชอ name , age และ sex
กจกรรมเสรมทกษะ
ใหนกเรยนทดลองเขยนโปรแกรมทมการแสดงการรบและแสดงผลจากไฟลขอมล และใหบนทกไฟลชอ ex10_2.cpp
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
#include <stdio.h> #include <conio.h> #include <stdlib.h> main() { char a[20]="joy",c='F', char name[20],sex; int b=45; int age; FILE *fp; fp=fopen("d:\\data.txt","w"); fprintf(fp,"%s\n %d\n %c\n",a,b,c); fclose(fp); fp=fopen("d:\\data.txt","r"); fscanf(fp,"%s %d %c",name,&age,&sex); printf("\n %s %d %c",name,age,sex); fclose(fp); getch(); }
รปภาพ แสดงผลลพธทไดจากการท างานของ
โปรแกรม ex10_2.exe และ nodepad
8
3. การใชฟงกชน fputc( )
เปนฟงกชนทท างานคลายกบฟงกชน putchar() เปนการน าตวอกขระจ านวน 1 ไบตไปบนทกไวในไฟลทตวแปรไฟลพอยนเตอรชอย โดยมรปแบบการใชงานดงน รปแบบ
fputc( ‘อกขระ’, ชอไฟลพอนตเตอร);
ตวอยางท 1
fputc ( ‘A’ , fp);
หมายถง การน าอกขระ ‘A’ ไปแสดงผลหรอบนทกลงในไฟลทตวแปรไฟลพอยนเตอร ทชอ fp ชอย
ตวอยางท 2
fputc ( ‘A’ , FILE *fp);
หมายถง การน าอกขระ ‘A’ ไปแสดงผลหรอบนทกลงในไฟลทตวแปรไฟลพอยนเตอร ทชอ fp ชอย
4. การใชฟงกชน fgetc( )
เปนฟงกชนทท างานคลายกบ getchar() เปนการรบอกขระจ านวน 1 ไบตจากไฟลทตวแปรไฟลพอยนเตอรชอย โดยมรปแบบการใชงานดงน รปแบบ
fgetc( ชอไฟลพอนตเตอร);
ตวอยางท 1
ans=fgetc ( fp);
หมายถง การน าอกขระจากไฟลทตวแปรไฟลพอยนเตอรชอยมาเกบไวในตวแปร ans
9
ตวอยางท 2
printf(“%c”,fgetc(fp));
หมายถง แสดงคาของอกขระทบนทกอยในไฟลทตวแปรไฟลพอยนเตอรทชอ fp ชอย กจกรรมเสรมทกษะ
ใหนกเรยนทดลองเขยนโปรแกรมทมการแสดงการรบและแสดงผลอกขระจากไฟลขอมล และใหบนทกไฟลชอ ex10_3.cpp
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include <stdio.h> #include <conio.h> #include <stdlib.h> char ans; main() { FILE *fp; fp=fopen("d:\\data.txt","w"); if(fp==NULL) { printf("Can not open file\n"); exit(0); } fputc('A' , fp); fputc('B' , fp); fputc('C' , fp); fclose(fp); fp=fopen("d:\\data.txt","r"); ans=fgetc(fp); printf("%c",ans); ans=fgetc(fp); printf("%c",ans); ans=fgetc(fp); printf("%c",ans); fclose(fp); getch(); }
รปภาพ แสดงผลลพธทไดจากการท างานของ
โปรแกรม ex10_3.exe และ nodepad
10
4. การใชฟงกชน fputs( )
เปนฟงกชนทท างานคลายกบ fprintf() คอ สามารถเขยนขอมลประเภทขอความ (String) ลงไปในไฟลได แต fprintf() มจดเดนคอสามารถก าหนดขอมลลงไปในตวแปรไดดวย รปแบบ
fputs( “ขอความ” , ชอตวแปรไฟลพอยนเตอร);
ตวอยาง
FILE *fp; fp=fopen("d:\\data.txt","w"); fputs("Chaibadanwitthaya\n",fp);
หมายถง การน าขอความค าวา “Chaibadanwitthaya” ทจ านวนตวอกษร 17 ตวเกบไวใน ในไฟลทชอวา data.txt โดยมตวแปรไฟลพอยนเตอรทชอวา fp ชต าแหนงอย
4. การใชฟงกชน fgets( )
เปนฟงกชนทท างานคลายกบ fscanf() คอ สามารถรบขอมลประเภทขอความ (String) ได แตค าสง fgets() จะเปนการรบขอความจากไฟลไดทตวแปรไฟลพอยนเตอรชอยโดยอาศยโครงสรางการจดเกบขอมลในรปแบบของอารเรยเวลารบคามาตองรบคาในรปแบบอารเรยเชนกน รปแบบ
fgets( “ขอความ” , จ านวนตวอกษรทตองการ ,ชอตวแปรอารเรย);
ตวอยาง
fgets(ans , 18 , fp); printf("%s",ans);
หมายถง การน าขอความ ทจ านวนตวอกษร 17 ตวทเกบไวในไฟลทชอวา data.txt โดยมตวแปรไฟลพอยนเตอรทชอวา fp ชต าแหนงอยมาเกบไวในตวแปรทชอ ans แลวแสดงคาทเกบไวในตวแปร ans ใหแสดงผลลพธได
11
n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
ans[n] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
ขอมล C h a i b a d a n w i t t h a y a \n
การจ าลองหนวยความจ าในการจดเกบขอความค าวา Chaibadanwitthaya ในไฟลทชอวา data.txt
กจกรรมเสรมทกษะ
ใหนกเรยนทดลองเขยนโปรแกรมทมการแสดงการรบและแสดงผลอกขระจากไฟลขอมล และใหบนทกไฟลชอ ex10_4.cpp
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include <stdio.h> #include <conio.h> #include <stdlib.h> char ans[18]; main(void) { FILE *fp; fp=fopen("d:\\data.txt","w"); if(fp==NULL) { printf("Can not open file\n"); exit(0); } fputs("Chaibadanwitthaya\n",fp); fclose(fp); fp=fopen("d:\\data.txt","r"); while(!feof(fp)) { fgets(ans,18,fp); printf("%s",ans); } fclose(fp); getch(); }
รปภาพ แสดงผลลพธทไดจากการท างานของ
โปรแกรม ex10_4.exe และ nodepad