วิชา การพัฒนาโปรแกรม...

12
0 วิชา การพัฒนาโปรแกรม (ภาษาซี) รหัสวิชา ว31293 หน่วยการเรียนรู้ที่ 10 การจัดการไฟล์ ผลการเรียนรู มีความรู้ความเข้าใจในการทางานประมวลผลข้อมูลร่วมกับไฟล์ข้อมูลชนิดเท็กซ์ไฟล์และ ไฟล์แบบไบนารีได้นาไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้ จุดประสงค์การเรียนรู 1. อธิบายความหมายของไฟล์ได้ 2. อธิบายขบวนการประมวลผลกับไฟล์ได้ 3. เข้าใจเกี่ยวกับไฟล์แบบเท็กซ์ไฟล์และไฟล์แบบไบนารีไฟล์ 4. สามารถเขียนโปรแกรมเปิดและปิดไฟล์ได้ 5. สามารถเขียนโปรแกรมเพื่อเก็บข้อมูลเป็นไฟล์ได้ สาระการเรียนรู 1. ประเภทของไฟล์ 2. การทางานกับเท็กไฟล์ 3. การใช้คาสั่งทางานข้อมูลกับเท็กซ์ไฟล์

Upload: others

Post on 02-Oct-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

0

วชา การพฒนาโปรแกรม (ภาษาซ) รหสวชา ว31293

หนวยการเรยนรท 10 การจดการไฟล

ผลการเรยนร

มความรความเขาใจในการท างานประมวลผลขอมลรวมกบไฟลขอมลชนดเทกซไฟลและไฟลแบบไบนารไดน าไปประยกตใชงานในการเขยนโปรแกรมภาษาซได

จดประสงคการเรยนร

1. อธบายความหมายของไฟลได 2. อธบายขบวนการประมวลผลกบไฟลได 3. เขาใจเกยวกบไฟลแบบเทกซไฟลและไฟลแบบไบนารไฟล 4. สามารถเขยนโปรแกรมเปดและปดไฟลได 5. สามารถเขยนโปรแกรมเพอเกบขอมลเปนไฟลได

สาระการเรยนร 1. ประเภทของไฟล 2. การท างานกบเทกไฟล 3. การใชค าสงท างานขอมลกบเทกซไฟล

Page 2: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

1

ใบความรท 10 เรอง การจดการไฟล

จดท าโดย นางพรพนารตน ชมภนช

ในงานบางประเภท จะตองน าผลการท างานของโปรแกรมเกบลงในหนวยความจ าส ารอง ลกษณะของขอมลทเกบในหนวยความจ าส ารองนจะเกบเปนไฟล ซงไฟลในภาษาซมอยหลายประเภท แตละประเภทมค าสงในการอานเขยนไฟลตางกน ดงนนถาหากตองการเขยนขอมลเปนไฟลจะตองท าความเขาใจฟงกชนทกระท ากบไฟลดวย

ประเภทของไฟล

ในบทนจะกลาวถงลกษณะของไฟลหรอแฟมขอมล และการเขยนโปรแกรมและอานไฟลกบหนวยความจ าส ารองทใชเกบขอมลเวลาปดเครองคอมพวเตอร หนวยความจ านขอมลจะไมหาย เชน ฮารดไดรฟ หรอซดรอม กอนทจะศกษาเรองไฟลจะตองเขาใจกค าวา สตรม (stream) เสยกอน

สตรม (stream) เปนหนวยของขอมลท

เ ร ยง ตดกน โดยขอ มลแ ตละหนวยอาจ เ ปนโครงสรางหรอขอมลชนดเดยวกนกได สวนไฟลจะเปนจดทใชตดตอกบสตรมเพอรบหรอสงขอมลกได

สตรมแบบตามลกษณะขอมลจะแบงออกเปน 2 ประเภท คอ

1. สตรมเทกซ (text stream) หรอ เทกซไฟล (text file) 2. สตรมไบนาร (binary stream) หรอ ไบนารไฟล (binary file)

1. สตรมเทกซ (text stream) เปนไฟลทจดเกบขอความ ซงมคณลกษณะทส าคญคอ จะบนทกขอมลทเปนขอความตาง ๆ ตามรหสแอสกของแตละตวอกขระ ดงนน สตรมเทกซ หรอเทกซไฟลจงสามารถถกเปดอานดวยโปรแกรม Notepad และสามารถอานขอความทบนทกไวอยางเขาใจ อยางไรกตาม ส าหรบเรคคอรดทถกบนทกลงในเทกซไฟลนน ในแตละเรคคอรดจะตองถกปดทายดวยรหสปดขนบรรทดใหม (\n) ดวยเพอใหรบรวา แตละบรรทดจะเปนขอมลของเรคคอรดนน ๆ

Stream คอ....

Page 3: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

2

2. สตรมไบนาร(binary stream) เปนแฟมขอมลทจดเหบขอมลชนดเลขฐานสอง ดงนน สตรมไบนารหรอไบนารไฟล เมอถกเปดดวยโปรแกรม notepad แลว จะเปนรหสขอมลตาง ๆ ทเราไมสามารถอานได เนองจากเปนภาษาเครองหรอเลขฐาน 2 นนเอง

และสงส าคญของไฟลทง 2 ลกษณะทเกบขอมลทง 2 แบบนน ขอมลแตละไบตจะถกเกบเรยงกนไปและจบทายดวยรหส EOF (End of File)

การท างานกบเทกไฟล

1. ตวแปรพอยนเตอร

ในการเขยนโปรแกรมเพอสรางหรอานไฟลกบแผjนดสกหรอหนวยความจ าส ารอง จะตองใชตวแปรตวหนงทมชอวา ไฟลพอยนเตอร (File Pointer) ตวแปรตวนจะบอกวาต าแหนงทเราก าลงจะด าเนนการอยนอยทต าแหนงใดของไฟล เชน ตนไฟล กลางไฟล หรอทายไฟล ถาหากไมมตวแปรไฟลพอยนเตอรเราจะไมสามารถกระท าการใด ๆ กบไฟลได

รปแบบค าสง การประกาศเพอก าหนดตวแปรท าหนาทเปนไฟลพอยนเตอร

File *ชอตวแปรไฟลพอยนเตอร

2. การเปดไฟล

การเปดไฟลบนแผนดสกหรอหนวยความจ าส ารอง จะใชฟงกชน fopen( ) อยใน เฮดเดอรไฟลทชอ stdio.h โดยมรปแบบการใชงานค าสง ดงน

ตวแปรไฟล = fopen(“ชอไฟล”, “รปแบบการเปดไฟล”);

โดยจะเปดไฟลตามทก าหนดไวในชอไฟลซงอาจเปนชอไฟลคงทหรอเปนตวแปรสตรงกได โดยสามารถระบไดรฟทเกบขอมลลงไปดวยกได สวนรปแบบการเปดไฟลจะเปนตวบอกวาไฟลทเปดนนเราตองการท าอะไร โดยมรปแบบดงตารางตอไปน

Page 4: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

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 ถาหากในหนวยความจ าส ารองไมมไฟลชอน กจะเปนการสรางไฟลนขนมาใหม แตถามไฟลอยแลวกจะถกเขยนทบ

Page 5: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

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 *ชอตวแปรไฟลพอยนเตอร)

Page 6: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

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

Page 7: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

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(ชอตวแปรไฟลพอยนเตอร, “รปแบบการแสดงผล” , ชอตวแปร );

Page 8: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

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

Page 9: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

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

Page 10: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

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

Page 11: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

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 ใหแสดงผลลพธได

Page 12: วิชา การพัฒนาโปรแกรม ภาษาซี)ไฟล์แบบไบนารีได้น าไปประยุกต์ใช้งานในการเขียนโปรแกรมภาษาซีได้

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