การอ่านแฟ้มข้อมูลประเภท Text

Download Report

Transcript การอ่านแฟ้มข้อมูลประเภท Text

FILE OPERATIONS
030523300- Computer Programming
Asst. Prof. Dr. Choopan Rattanapoka
File และ การใช้งาน

ชนิ ดของ File ในภาษา C แบ่งเป็ น
่ ้ในการเก็บตัวขระปกติ
file เป็ นแฟ้ มข ้อมูลทีใช
้ ดของบรรทัดทีแน่
่ นอน ซึงก็
่ คอ
มีการสินสุ
ื ‘\n’ ใน
่
ภาษา C สามารถอ่าน หรือ เขียนแฟ้ มข ้อมูลทีละ
บรรทัดได ้
่ ้เก็บเลขฐาน 2
 Binary file เป็ นแฟ้ มข ้อมูลทีใช
ต่อเนื่ องกัน จะไม่มข
ี อบเขตของบรรทัด เวลาใช ้งาน
จึงต ้องกาหนดขนาดในการ อ่าน หรือ เขียน เป็ น
จานวนไบต ์ (byte)
 Text
่
การกาหนดชือของแฟ
้ มข้อมู ล

DOS และ Windows 3.X
ื่ ของแฟ้ มข ้อมูลจะมีความยาวสูงสุดได ้เพียง
 ชอ
8
ตัวอักษร ตามด ้วย ‘.’ และ นามสกุลอีก 3 ตัวอักษร

Windows 95 หรือ สูงกว่า
ื่ ของแฟ้ มข ้อมูลจะมีความยาวสูงสุดได ้ 256
 ชอ

้
ื่ แฟ้ มข ้อมูล
ตัวอักษรทีห
่ ้ามใชในการตั
ง้ ชอ
/

ตัวอักษร
\
:
* ? “
< > |
่
ตาแหน่งทีอ
่ ยูข
่ องแฟ้ มข ้อมูล เรียกว่า Path เชน
 C:\myprogram\mysubdir\readme.txt
Path
่
ชือแฟ
้ มข้อมู ล
่
คาสังจัดการแฟ
้ มข้อมู ลในภาษา C

้
กลุม
่ คาสงั่ ทีใ่ ชในการจั
ดการเกีย
่ วกับแฟ้ มข ้อมูล แบ่ง
ออกเป็ น 4 ประเภทใหญ่ๆคือ
 เปิ ดแฟ้ มข ้อมูล
 ปิ ดแฟ้ มข ้อมูล
 อ่านแฟ้ มข ้อมูล
 เขียนแฟ้ มข ้อมูล
การเปิ ดแฟ้มข้อมู ล


ทุกครัง้ ทีจ
่ ะทางานต่างๆ เกีย
่ วกับแฟ้ มข ้อมูล จาเป็ น
จะต ้องทาการเปิ ดแฟ้ มข ้อมูลนัน
้ ขึน
้ มาก่อน
เงือ
่ นไขในการเปิ ดแฟ้ มข ้อมูล
ไม่มอ
ี ยู ่ในระบบ การเปิ ด
้
แฟ้ มข ้อมูลในภาษา C จะเป็ นการ สร ้างแฟ้มข้อมู ลนัน
้
ขึนมาใหม่
 ถ ้าแฟ้ มข ้อมูลทีถ
่ ก
ู เปิ ด มีอยู ่ในระบบ การเปิ ด
้
แฟ้ มข ้อมูลในภาษา C จะเป็ นการแก้ไขแฟ้มข้อมู ลนัน
 ถ ้าแฟ้ มข ้อมูลทีถ
่ ก
ู เปิ ด

้
คFILE
าสงั่ *fopen(const
(function) ทีchar
ใ่ ชในการเปิ
ด, const
แฟ้ มข
้อมู*mode);
ลในภาษา
*filename
char
C คือ
การใช้งาน fopen
FILE *fopen(const char *filename , const char *mode);

Return value
 คืนค่า
NULL ถ ้าเปิ ดแฟ้ มข ้อมูลไม่สาเร็จ
 คืนค่า pointer ทีช
่ ไี้ ปยังแฟ้ มข ้อมูลนัน
้ ถ ้าเปิ ดแฟ้ มข ้อมูล
สาเร็จ

Parameters
ื่ แฟ้ มข ้อมูลทีต
char *filename ชอ
่ ้องการจะเปิ ด
่ “C:\\Program Files\\Hello.txt”
เชน
 const
 const
char *mode โหมดทีจ
่ ะทางานกับแฟ้ มข ้อมูลนี้
โหมดการทางานในการเปิ ด
แฟ้มข้อมู ล

ใน const char *mode สามารถระบุโหมดการทางานดังนี้
r เป็ นการเปิ ดแฟ้ มข ้อมูลเพือ
่ อ่าน (read) ถ ้าแฟ้ มข ้อมูลนัน
้ ไม่
มีอยูใ่ นระบบ fopen จะคืนค่า NULL
 w เป็ นการเปิ ดแฟ้ มข ้อมูลเพือ
่ เขียน (write) ถ ้าแฟ้ มข ้อมูลนัน
้
ไม่มอ
ี ยูใ่ นระบบ จะเป็ นการสร ้างแฟ้ มข ้อมูลใหม่ แต่ถ ้ามี
แฟ้ มข ้อมูลอยูใ่ นระบบ จะเป็ นเขียนทับแฟ้ มข ้อมูลทีเ่ ปิ ด
 a เป็ นการเปิ ดแฟ้ มข ้อมูลเพือ
่ เขียนต่อ (append) ถ ้า
แฟ้ มข ้อมูลไม่มอ
ี ยูใ่ นระบบจะเป็ นการสร ้างแฟ้ มข ้อมูลใหม่ แต่
ถ ้ามีแฟ้ มข ้อมูลอยูใ่ นระบบจะเป็ นการเขียนต่อท ้าย
 r+ หรือ w+ เป็ นการเปิ ดแฟ้ มข ้อมูลเพือ
่ อ่านและเขียน ถ ้า
แฟ้ มข ้อมูลไม่มอ
ี ยูจ
่ ะสร ้างแฟ้ มข ้อมูลใหม่ แต่ถ ้ามีแฟ้ มข ้อมูล
อยูแ
่ ล ้วการเขียนจะเป็ นการเขียนทับ
 a+ เป็ นการเปิ ดแฟ้ มข ้อมูลเพือ
่ อ่านและเขียน ถ ้าแฟ้ มข ้อมูล
ไม่มอ
ี ยูจ
่ ะสร ้างแฟ้ มข ้อมูลใหม่ แต่ถ ้ามีแฟ้ มข ้อมูลอยูแ
่ ล ้วการ

โหมดการทางานในการเปิ ด
แฟ้มข้อมู ล (ต่อ)

ใน const char *mode สามารถระบุโหมดการทางาน
ดังนี้
เป็ นการเปิ ดแฟ้ มข ้อมูลประเภท text file ในกรณีทไี่ ม่
ระบุภาษา C จะเป็ นการทางานเป็ นโหมด text file
 b เป็ นการเปิ ดแฟ้ มข ้อมูลประเภท binary file
t

ตัวอย่าง เปิ ดแฟ้ มข ้อมูล c:\tmp\hello.txt ทีเ่ ป็ น
แฟ้ มข ้อมูลแบบ text เพือ
่ อ่านและเขียนแบบไม่ทับ
ข ้อมูลเก่าในแฟ้ มข ้อมูล
 fopen(“c:\\tmp\\hello.txt”,
“a+t”);
การปิ ดแฟ้มข้อมู ล
int fclose(FILE *fp);

Parameter
pointer ของ FILE ทีไ่ ด ้จากการเปิ ดแฟ้ มข ้อมูลมาสง่
เพือ
่ ใชปิ้ ด
 เอา

Return value
 ถ ้าการปิ ดแฟ้ มข ้อมูลเรียบร ้อย
คาสงั่ fclose จะคืนค่าเป็ น
0
 ถ ้ามีข ้อผิดพลาดระหว่างปิ ดแฟ้ มข ้อมูล fclose จะคืนค่า
เป็ น EOF
ตัวอย่างการเปิ ด/ปิ ด แฟ้มข้อมู ล
#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
int fprintf(FILE *fp, char *fmt, ...);
้
การใชงานคล
้ายกับคาสงั่ printf เพียงแต่เพิม
่
parameter เข ้ามา 1 ตัวคือ FILE *fp
การคืนค่า
 ถ ้าการเขียนสาเร็จจะคืนค่าเป็ นจานวนเต็มบวก
เท่ากับ
จานวนไบต์ทเี่ ขียนลงแฟ้ มข ้อมูล
 ถ ้ามีข ้อผิดพลาดระหว่างการเขียนข ้อมูล จานวนเต็มลบ
จะถูกคืนค่ากลับ
ตัวอย่างการเขียนแฟ้ มข ้อมูล
ประเภท Text
#include <stdio.h>
int main(int argc, char **argv) {
FILE *fp;
test.txt
int I = 25; char grade = ‘A’;
I = 25, 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;
}
การอ่านแฟ้มข้อมู ลประเภท Text

คาสงั่ ในการอ่านแฟ้ มข ้อมูลประเภท text ทีละบรรทัด
int fscanf(FILE *fp, const char *fmt, ...);


้
การใชงานคล
้ายกับคาสงั่ scanf เพียงแต่เพิม
่
parameter เข ้ามา 1 ตัวคือ FILE *fp
การคืนค่า
ิ้ สุดของแฟ้ มข ้อมูล หรือ มี
ถ ้าการอ่านถึงจุดสน
ข ้อผิดพลาดระหว่างการอ่าน
 EOF
ตัวอย่างการอ่านแฟ้มข้อมู ล
ประเภท 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;
}
test.txt
10 5
11 20
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);
test.txt
}
10 5
fclose(fp);
11 20
system(“PAUSE”);
Monitor
return 0;
X = 10,
}
X = 11,
Y=5
Y = 20
การอ่าน/เขียนแฟ้มข้อมู ลประเภท Text
แบบต ัวอ ักษร

คาสงั่ ในการเขียนแฟ้ มข ้อมูลประเภท text แบบ
ตัวอักษรอย่างเดียว
 int
fputc(int c, FILE *fp);
 int fputs(const char *s, FILE *fp);

คาสงั่ ในการอ่านแฟ้ มข ้อมูลประเภท text แบบ
ตัวอักษรอย่างเดียว
fgetc(FILE *fp); -> EOF เมือ
่ สุดแฟ้ ม
 char *fgets(char *s, int size, FILE *fp); -> NULL เมือ
่ สุด
แฟ้ ม
 int
ตัวอย่างการใช ้ 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
int fread(void *buf, int size, int count, FILE *fp);

้
คาสงั่ ทีใ่ ชในการเขี
ยนแฟ้ มข ้อมูลแบบ Binary
int fwrite(void *buf, int size, int count, FILE *fp);

Parameter
้ ยนลงแฟ้ มข ้อมูล(fwrite) หรือ
buf ข ้อมูล Buffer ทีจ
่ ะใชเขี
อ่านจากแฟ้ มข ้อมูลมาเก็บไว ้(fread)
 size ขนาดของประเภทข ้อมูล (sizeof)
 count จานวนข ้อมูลทีจ
่ ะเขียน/อ่าน ลง แฟ้ มข ้อมูล

่
การจัดการเกียวกับ
file pointer
int fseek(FILE *fp, long offset, int where);


้ อ
ใชเลื
่ นตาแหน่ง file pointer ไปตาแหน่งต่างๆใน
แฟ้ มข ้อมูล
Parameter
offset เป็ นค่าทีน
่ าไป บวก กับ ค่าของ where เพือ
่ กาหนด
ตาแหน่งของ fp
 where เป็ นจุดอ ้างอิงของ fp

SEEK_SET
 SEEK_CUR
 SEEK_END

้
ใชแทนต
าแหน่งเริม
่ ต ้นของแฟ้ มข ้อมูล
้
ี้ ยู่
ใชแทนต
าแหน่งปั จจุบน
ั ที่ fp ชอ
้
ใชแทนต
าแหน่งท ้ายสุดของแฟ้ มข ้อมูล
void rewind(FILE *fp);

้ อ
ใชเลื
่ นตาแหน่ง file pointer กลับไปทีจ
่ ด
ุ เริม
่ ต ้นของ
การทางานของ fseek
test.txt
monitor
ABCDEFGHIJKLMNOPQRSTUVWXYZ
fpfp
fpfp
#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;
}
A
G
แบบฝึ กหัด fseek
#include<stdio.h>
int main(int argc, char **argv)
{
FILE *fp;
fp = fopen("c:\\kk.txt","rb");
kk.txt
123456789
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();
}