200 likes | 306 Vues
C Programming. Lecture no. 9 Files System. การใช้ file ในภาษาซี. ฟังก์ชั่นต่างๆ ในการจัดการ file มีแนวคิดมาจากเรื่อง I / O stream ซึ่งเปรียบเสมือน character array ที่ยาวไม่มีที่สิ้นสุด โดย stream ที่ว่านี้สามารถ access ได้ดังนี้
E N D
C Programming Lecture no. 9 Files System
การใช้file ในภาษาซี ฟังก์ชั่นต่างๆในการจัดการfile มีแนวคิดมาจากเรื่องI/O stream ซึ่งเปรียบเสมือนcharacter array ที่ยาวไม่มีที่สิ้นสุด โดยstream ที่ว่านี้สามารถaccess ได้ดังนี้ - โดยใช้file pointers เป็นการจัดการระดับสูงหรือbuffered - โดยใช้file descriptors เป็นการจัดการในระดับต่ำหรือunbuffered 310322 C Programming
ในกรณีของfile pointer คือpointer ที่ชี้ไปยังdata type FILE ซึ่งถูกกำหนดไว้ในstdio.h โดยเป็นstructure ที่เป็นที่เก็บรวบรวมข้อมูลที่เกี่ยวข้องกับfile นั้นเช่น - File descripter - ตำแหน่งปัจจุบันในbuffer - Pointers ไปยังbuffers - ในขณะนั้นfile กำลังถูกread หรือwrite อยู่หรือไม่ 310322 C Programming
ในกรณีของfile pointer (2) • มีfile pointers อยู่ 3 ชนิดซึ่งมีอยู่ก่อนหน้านั้นแล้วได้แก่ - stdin - stdout - stderr • ทั้งนี้ก่อนที่file จะสามารถถูกread หรือwrite จะต้องใช้ฟังก์ชั่นในC library ชื่อfopen() เปิดfile ไว้ก่อนซึ่งมีlimit ว่าจะสามารถเปิดได้กี่files พร้อมๆกัน • หลังจากที่files ถูกใช้เสร็จแล้วfiles จะต้องถูกปิดโดยใช้ฟังก์ชั่น fclose() ซึ่งเป็นการเคลียร์file buffer และตัดconnection ไปยังfile นั้นออก 310322 C Programming
การเปิดไฟล์ (Opening Files) ใช้ฟังก์ชั่นfopen() ซึ่งมีรูปแบบดังนี้ FILE *fopen( char *path, char *mode); ฟังก์ชั่นนี้มี 2 arguments ทั้ง 2 arguments เป็นpointer ไปยังcharacter strings โดยpointer แรกจะเก็บค่าaddress ของชื่อfile ที่จะถูกเปิดและpointer ที่ 2 เป็นaddress ของaccess mode 310322 C Programming
ตารางต่อไปนี้แสดงความหมายของaccess mode ถ้าฟังก์ชั่นfopen() ทำงานสำเร็จจะreturn ค่าของfile pointer แต่หากทำงานไม่สำเร็จ (ไม่สามารถเปิดfile ได้) ฟังก์ชั่นจะreturn NULL 310322 C Programming
การปิดfiles (Clossing files) เมื่อใช้files แล้วจะต้องปิดด้วยฟังก์ชั่นflose() ซึ่งมีรูปแบบดังนี้ int fclose( FILE *stream); ฟังก์ชั่นfclose() จะreturn ค่า 0 หากทำงานสำเร็จหากทำไม่สำเร็จจะreturn ค่าเป็นEOF 310322 C Programming
ศึกษาการใช้fopen() และfclose() #include <stdio.h> int main(void) { FILE *fptr; fptr = fopen("ascii.c","r"); if(fptr != NULL){ printf("Hay I can open myself\n"); close(fptr); } else printf("Hi my source is lost\n"); return (0); } 310322 C Programming
Character Input และOutput จากFiles • ในการอ่านcharacter จากinput stream ที่ถูกชี้โดยfile pointer สามารถใช้ฟังก์ชั่นgetc() และfgetc() ซึ่งมีรูปแบบของฟังก์ชั่นดังนี้ int fgetc(FILE *stream); int getc(FILE *stream); • โดยหากฟังก์ชั่นทำงานสำเร็จฟังก์ชั่นจะคืนค่าเป็นcharacter ในรูปแบบของinteger และหากทำงานไม่สำเร็จจะคืนค่าEOF กลับมาขอให้ดูวิธีการใช้ฟังก์ชั่นจากโปรแกรมต่อไปนี้ 310322 C Programming
#include <stdio.h> main() { int ch; FILE *fptr; fptr = fopen("hr12b.c","r"); if(fptr != NULL){ printf("Hay I can open myself\n"); while ((ch = getc(fptr))!=EOF){ printf("%c",ch); } close(fptr); } else printf("Hi my source is lost\n"); } 310322 C Programming
ฟังก์ชั่นสำหรับการwrite character ไปสู่file • ฟังก์ชั่นสำหรับการwrite character ไปสู่file 2 ฟังก์ชั่นดังนี้ int fputc(int c, FILE *stream); int putc(int c, FILE *stream); • ฟังก์ชั่นทั้ง 2 มี 2 arguments โดยargument แรกเป็นcharacter ในรูปแบบของinteger ส่วนargument ที่ 2 เป็นfile pointer • ถ้าฟังก์ชั่นทำงานสำเร็จจะreturn character ที่output ไปในรูปแบบของinteger หากทำงานไม่สำเร็จจะคืนค่าEOF 310322 C Programming
การcopy file #include <stdio.h> main() { int ch; FILE *infile, *outfile; infile = fopen("hr12c.c","r"); outfile = fopen("hr12c.copy","w"); if((infile == NULL)||(outfile == NULL)) printf("File open error\n"); } 310322 C Programming
การcopy file (2) else { ch = fgetc(infile); while (ch != EOF) { fputc((char)ch, outfile); ch = fgetc(infile); } } if (infile != NULL) fclose(infile); if (outfile != NULL) fclose(outfile); } 310322 C Programming
Line Oriented Input และOutput กับFiles มีฟังก์ชั่นที่เกี่ยวข้องดังต่อไปนี้ int fputs(const char *s, FILE *stream); char *fgets(char *s, int size, FILE *stream); 310322 C Programming
ตัวอย่าง #include <stdio.h> #define SIZE 100 main() { char *linein, *lineout; FILE *fp; fp = fopen("hr12d.c","r"); if (fp == NULL) printf("Cannot open file\n"); else 310322 C Programming
ตัวอย่าง (2) do { lineout = fgets(linein,SIZE,fp); fputs(lineout,stdout); } while (*linein != EOF); close(fp); } โปรแกรมนี้มีอะไรผิดหรือเหตุใดจึงเกิดSegmentation fault ที่ผลรัน 310322 C Programming
Formatted Input และOutput กับFiles ใช้ฟังก์ชั่นfprintf() และfscanf() ซึ่งทำงานเหมือนกับprintf() และscanf() ยกเว้นมีarguments ตัวแรกเป็นfile pointer รูปแบบของฟังก์ชั่นมีดังนี้ int fscanf( FILE *stream, const char *format, ...); int fprintf( FILE *stream, const char *format, ...); 310322 C Programming
ตัวอย่าง #include <stdio.h> #define STRSIZE 1000 #define READ "r" void main() { FILE *fp; int wc = 0; int checkread; char word[STRSIZE]; fp = fopen("hr12e.c",READ); if (fp == NULL) fprintf(stderr, "Can't open file"); 310322 C Programming
ตัวอย่าง (2) else { checkread = fscanf(fp,"%s",word); while (checkread != EOF) { wc++; checkread = fscanf(fp,"%s",word); } fprintf(stdout,"Number of words %d\n",wc); fclose(fp); } } 310322 C Programming