Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
FILE OPERATIONS
030523300- Computer Programming
Asst. Prof. Dr. Choopan Rattanapoka
File และ การใชงาน
ชนดของ File ในภาษา C แบงเปน
Text file เปนแฟมขอมลทใชในการเกบตวขระปกต มการสนสด
ของบรรทดทแนนอน ซงกคอ ‘\n’ ในภาษา C สามารถอาน หรอ
เขยนแฟมขอมลทละบรรทดได
Binary file เปนแฟมขอมลทใชเกบเลขฐาน 2 ตอเนองกน จะไมม
ขอบเขตของบรรทด เวลาใชงานจงตองก าหนดขนาดในการ อาน หรอ
เขยน เปนจ านวนไบต (byte)
การก าหนดชอของแฟมขอมล
DOS และ Windows 3.X
ชอของแฟมขอมลจะมความยาวสงสดไดเพยง 8 ตวอกษร ตามดวย ‘.’ และ นามสกลอก 3 ตวอกษร
Windows 95 หรอ สงกวา
ชอของแฟมขอมลจะมความยาวสงสดได 256 ตวอกษร
ตวอกษรทหามใชในการตงชอแฟมขอมล
/ \ : * ? “ < > |
ต าแหนงทอยของแฟมขอมล เรยกวา Path เชน
C:\myprogram\mysubdir\readme.txt
Path ชอแฟมขอมล
ค าสงจดการแฟมขอมลในภาษา C
กลมค าสงทใชในการจดการเกยวกบแฟมขอมล แบงออกเปน 4 ประเภท
ใหญๆคอ
เปดแฟมขอมล
ปดแฟมขอมล
อานแฟมขอมล
เขยนแฟมขอมล
การเปดแฟมขอมล
ทกครงทจะท างานตางๆ เกยวกบแฟมขอมล จ าเปนจะตองท าการเปด
แฟมขอมลนนข นมากอน
เงอนไขในการเปดแฟมขอมล
ถาแฟมขอมลทถกเปด ไมมอยในระบบ การเปดแฟมขอมลในภาษา C จะเปน
การ สรางแฟมขอมลนนขนมาใหม
ถาแฟมขอมลทถกเปด มอยในระบบ การเปดแฟมขอมลในภาษา C จะเปนการ
แกไขแฟมขอมลนน
ค าสง (function) ทใชในการเปดแฟมขอมลในภาษา C คอ
FILE *fopen(const char *filename , const char *mode);
การใชงาน fopen
Return value
คนคา NULL ถาเปดแฟมขอมลไมส าเรจ
คนคา pointer ทช ไปยงแฟมขอมลนน ถาเปดแฟมขอมลส าเรจ
Parameters
const char *filename ชอแฟมขอมลทตองการจะเปด เชน“C:\\Program Files\\Hello.txt”
const char *mode โหมดทจะท างานกบแฟมขอมลน
FILE *fopen(const char *filename , const char *mode);
โหมดการท างานในการเปดแฟมขอมล
ใน const char *mode สามารถระบโหมดการท างานดงน r เปนการเปดแฟมขอมลเพออาน (read) ถาแฟมขอมลนนไมมอยในระบบ fopen
จะคนคา NULL
w เปนการเปดแฟมขอมลเพอเขยน (write) ถาแฟมขอมลนนไมมอยในระบบ จะเปนการสรางแฟมขอมลใหม แตถามแฟมขอมลอยในระบบ จะเปนเขยนทบแฟมขอมลท
เปด
a เปนการเปดแฟมขอมลเพอเขยนตอ (append) ถาแฟมขอมลไมมอยในระบบจะเปนการสรางแฟมขอมลใหม แตถามแฟมขอมลอยในระบบจะเปนการเขยนตอทาย
r+ หรอ w+ เปนการเปดแฟมขอมลเพออานและเขยน ถาแฟมขอมลไมมอยจะสรางแฟมขอมลใหม แตถามแฟมขอมลอยแลวการเขยนจะเปนการเขยนทบ
a+ เปนการเปดแฟมขอมลเพออานและเขยน ถาแฟมขอมลไมมอยจะสรางแฟมขอมลใหม แตถามแฟมขอมลอยแลวการเขยนจะเปนการเขยนตอทาย
โหมดการท างานในการเปดแฟมขอมล (ตอ)
ใน const char *mode สามารถระบโหมดการท างานดงน
t เปนการเปดแฟมขอมลประเภท text file ในกรณทไมระบภาษา C จะเปน
การท างานเปนโหมด text file
b เปนการเปดแฟมขอมลประเภท binary file
ตวอยาง เปดแฟมขอมล c:\tmp\hello.txt ทเปนแฟมขอมลแบบ
text เพออานและเขยนแบบไมทบขอมลเกาในแฟมขอมล
fopen(“c:\\tmp\\hello.txt”, “a+t”);
การปดแฟมขอมล
Parameter
เอา pointer ของ FILE ทไดจากการเปดแฟมขอมลมาสงเพอใชปด
Return value
ถาการปดแฟมขอมลเรยบรอย ค าสง fclose จะคนคาเปน 0
ถามขอผดพลาดระหวางปดแฟมขอมล fclose จะคนคาเปน EOF
int fclose(FILE *fp);
ตวอยางการเปด/ปด แฟมขอมล
#include <stdio.h>
int main(int argc, char **argv) {
FILE *fp;
if((fp = fopen(“test.txt”, “w”)) == NULL) {
printf(“Can not open file\n”); return 1;
}
if(fclose(fp) != 0) {
printf(“Error while closing file\n”);
return 1;
}
system(“PAUSE”);
return 0;
}
การเขยนแฟมขอมลประเภท Text
ค าสงในการเขยนแฟมขอมลประเภท text
การใชงานคลายกบค าสง printf เพยงแตเพม parameter เขามา 1
ตวคอ FILE *fp
การคนคา
ถาการเขยนส าเรจจะคนคาเปนจ านวนเตมบวก เทากบ จ านวนไบตทเขยนลง
แฟมขอมล
ถามขอผดพลาดระหวางการเขยนขอมล จ านวนเตมลบ จะถกคนคากลบ
int fprintf(FILE *fp, char *fmt, ...);
ตวอยางการเขยนแฟมขอมลประเภท Text
#include <stdio.h>
int main(int argc, char **argv) {
FILE *fp;
int I = 25; char grade = ‘A’;
if((fp = fopen(“test.txt”, “w”)) == NULL) {
printf(“Can not open file”); return 1;
}
if( fprintf(fp, “I = %d , grade = %c\n”, I, grade) < 0) {
printf(“Can not write file”); return 1;
}
printf(“work completed\n”);
fclose(fp);
system(“PAUSE”);
return 0;
}
I = 25, grade = A
test.txt
การอานแฟมขอมลประเภท Text
ค าสงในการอานแฟมขอมลประเภท text ทละบรรทด
การใชงานคลายกบค าสง scanf เพยงแตเพม parameter เขามา 1
ตวคอ FILE *fp
การคนคา
EOF ถาการอานถงจดสนสดของแฟมขอมล หรอ มขอผดพลาดระหวางการอาน
int fscanf(FILE *fp, const char *fmt, ...);
ตวอยางการอานแฟมขอมลประเภท Text
#include <stdio.h>
int main(int argc, char **argv) {
FILE *fp;
int x, y;
fp = fopen(“test.txt”, “r”);
fscanf(fp, “%d %d”, &x, &y);
fclose(fp);
printf(“X = %d, Y = %d\n”, x, y);
system(“PAUSE”);
return 0;
}
10 5
11 20
test.txt
Monitor
X = 10, Y = 5
ตวอยางการอานแฟมขอมลประเภท Text (ตอ)
#include <stdio.h>
int main(int argc, char **argv) {
FILE *fp;
int x, y;
fp = fopen(“test.txt”, “r”);
while(fscanf(fp, “%d %d”, &x, &y) != EOF) {
printf(“X = %d, Y = %d\n”, x, y);
}
fclose(fp);
system(“PAUSE”);
return 0;
}
10 5
11 20
test.txt
Monitor
X = 10, Y = 5
X = 11, Y = 20
การอาน/เขยนแฟมขอมลประเภท Text แบบตวอกษร
ค าสงในการเขยนแฟมขอมลประเภท text แบบตวอกษรอยางเดยว
int fputc(int c, FILE *fp);
int fputs(const char *s, FILE *fp);
ค าสงในการอานแฟมขอมลประเภท text แบบตวอกษรอยางเดยว
int fgetc(FILE *fp); -> EOF เมอสดแฟม
char *fgets(char *s, int size, FILE *fp); -> NULL เมอสดแฟม
ตวอยางการใช fputc
#include<stdio.h>
int main(int argc, char **argv){
char *ch = "Control Systems";FILE *fp;
if( (fp = fopen("c:\\test2.txt","w"))==NULL ){printf("error"); return 1;
}while(*ch != NULL){
fputc(*(ch++),fp); }
fclose(fp); system(“PAUSE”);return 0;
}
ตวอยางการใช fputs
include<stdio.h>
int main(int argc, char **argv){
int i; char mytext[3][64] = {"Control Systems","Digital","Computer"};FILE *fp;
if((fp = fopen("c:\\test3.txt","w"))==NULL ) {printf("error"); return 1;
}for(i=0;i<3;i++){ fputs(mytext[i], fp); }fclose(fp); system(“PAUSE”); return 0;
}
ตวอยางการใช fgetc
#include<stdio.h>
int main(int argc, char **argv){
char k;FILE *fp;
if( (fp = fopen("c:\\test.txt","r"))==NULL ) {printf("error"); return 1;
}while((k = fgetc(fp)) != EOF) {
printf("%c", k); }
fclose(fp);system(“pause”);return 0;
}
ตวอยางการใช fgets
#include<stdio.h>
int main(int argc, char **argv){
char str[64];FILE *fp;
if((fp = fopen("c:\\str_test.txt","r"))==NULL ){printf("error"); return 1 ;
}while(fgets(str,64,fp) != NULL) {
printf("%s", str); }fclose(fp);system(“PAUSE”);return 0;
}
การท างานกบแฟมขอมลแบบ Binary
ค าสงทใชในการอานแฟมขอมลแบบ Binary
ค าสงทใชในการเขยนแฟมขอมลแบบ Binary
Parameter buf ขอมล Buffer ทจะใชเขยนลงแฟมขอมล(fwrite) หรอ อานจากแฟมขอมลมา
เกบไว(fread)
size ขนาดของประเภทขอมล (sizeof)
count จ านวนขอมลทจะเขยน/อาน ลง แฟมขอมล
int fread(void *buf, int size, int count, FILE *fp);
int fwrite(void *buf, int size, int count, FILE *fp);
การจดการเกยวกบ file pointer
ใชเลอนต าแหนง file pointer ไปต าแหนงตางๆในแฟมขอมล
Parameter offset เปนคาทน าไป บวก กบ คาของ where เพอก าหนดต าแหนงของ fp
where เปนจดอางองของ fp SEEK_SET ใชแทนต าแหนงเรมตนของแฟมขอมล
SEEK_CUR ใชแทนต าแหนงปจจบนท fp ช อย
SEEK_END ใชแทนต าแหนงทายสดของแฟมขอมล
ใชเลอนต าแหนง file pointer กลบไปทจดเรมตนของแฟมขอมล
int fseek(FILE *fp, long offset, int where);
void rewind(FILE *fp);
การท างานของ fseek
ABCDEFGHIJKLMNOPQRSTUVWXYZ
test.txt
#include <stdio.h>
int main(int argc, char **argv) {
FILE *fp;
if((fp = fopen(“test.txt”, “rb”)) != NULL) {
printf(“%c\n”, fgetc(fp));
fseek(fp, 5, SEEK_CUR);
printf(“%c\n”, fgetc(fp));
fclose(fp);
}
system(“PAUSE”); return 0;
}
fp
monitor
fp AfpfpG
#include<stdio.h>
int main(int argc, char **argv)
{
FILE *fp;
fp = fopen("c:\\kk.txt","rb");
fseek(fp, 8, SEEK_SET); printf(“%c\n",fgetc(fp));
fseek(fp,-3, SEEK_END); printf(“%c\n",fgetc(fp));
fseek(fp,-3, SEEK_CUR); printf(“%c\n",fgetc(fp));
fseek(fp, 3,SEEK_CUR); printf(“%c\n",fgetc(fp));
fclose(fp); getch();
}
แบบฝกหด fseek
kk.txt
123456789