Transcript File

Computer Programming
การเขียนโปรแกรม
คอมพิวเตอร ์
สั ปดาหที
์ ่ 14
ไฟล ์ (File)
objectives
เพือ
่ ให้นิสิตรูจั
างานเกีย
่ วกับ
้ กและเขาใจการท
้
ไฟลในภาษาซี
์
สามารถเขียนโปรแกรมภาษาซีโดยสามารถ
ทางานรวมกั
บไฟลได
่
์ ้
สามารถนาความรูเรื
่ งไฟลไปประยุ
กตเพื
่ แกไข
้ อ
์
์ อ
้
โจทยปั
ิ ประจาวันไดได
กตอง
์ ญหาในชีวต
้ อย
้ างถู
่
้
เหมาะสม
Outline
1
Text File
2p
Open Text File
3
Close Text File
4
Read Text File
5
Write Text File
Text File
ไฟลข
น
้ เพือ
่ เก็บรวบรวมขอมู
้
้ ลตางๆ
่
์ ้อมูลถูกสรางขึ
เข้าไว้ดวยกั
น
้
ไ ฟ ล ์ ข้ อ มู ล มั ก จ ะ ถู ก เ ก็ บ อ ยู่ ใ น ห น่ ว ย ค ว า ม จ า
ภายนอก เช่น Hard Disk, CD หรือ DVD เป็ น
ต้ น
เมือ
่ คอมพิวเตอรท
(read) ข้อมูลจะถูก
่
์ าการอาน
สาเนาจากอุปกรณภายนอกเข
ามายั
งหน่วยความจา
้
์
ภายใน
Text File (cont.)
ในการเคลือ
่ นยายข
อมู
้ ทีห
่ น่วยความจาทีก
่ น
ั เอาไว้
้
้ ลนี้จะมีการใช้พืน
สาหรับงานนี้เป็ นพิเศษ ซึง่ เรียกวา่ “buffer” เนื่องจากการอานหรื
่
อนาข้อมูลจากอุปกรณภายนอกนั
้น ในบางครัง้ จะไดจ
้ านวนข้อมูล
์
ทีม
่ ากกวาที
่ ะป้อนเขาโปรแกรมในครั
ง้ เดียว
่ จ
้
ในทางกลับกันเมือ
่ โปรแกรมตองการบั
นทึกขอมู
้
้ ลลงฮารดดิ
์ สค ์
buffer จะทาหน้าทีใ่ นการพักข้อมูลไว้จนกวาจะมี
ขอมู
่
้ ลจานวนที่
มากพอทีจ
่ ะบันทึกลงฮารดดิ
์ สค ์
การทางานทีเ่ กีย
่ วของกั
บ buffer จะดูแลโดยโปรแกรมพิเศษทีเ่ รา
้
เรียกกันวา่ “device drivers” ซึง่ โปรแกรมนี้จะให้มาโดยผู้สร้าง
อุปกรณต
หรือมาพรอมกั
บ Operating System
่
้
์ างๆ
โปรแกรมภาษา C จะมองข้อมูลทีส
่ ่ งมาจากอุปกรณ์ (e.g.
keyboard) หรือไฟลว์ าเป็
่ นสายของข้อมูล (data stream) และ
เมือ
่ โปรแกรมตองการส
้
่ งขอมู
้ ลให้กับอุปกรณ์ (e.g. CRT) หรือ
Flush Data of Input Buffer
#define FLUSH while (getchar() != ‘\n’)
…………..
…………..
printf(\nPlease enter Number of Units Sold: “);
while ( scanf(“%d”, &unitsSold) != 1)
{
// scanf returns 1 if number read correctly
FLUSH;
printf(“\aInvalid number. Please re-enter: “);
}
C Programming & Text File
Data Destination
File or
CRT
Program
Output Text Stream
Data Source
Data
Program
File or
Input Text Stream
Keyboard
Data
Type of Data Stream
ภาษา C จะแบง่ data stream ออกเป็ น 2 ประเภท
คือ
 สายขอมู
้ ลตัวอักษร (Text Stream)
• เป็ นสายขอมู
่ นุ ษยสามารถอ
านได
้ ลตัวอักษรทีม
่
้ ข้อมูลจะอยู่
์
ในรูปแบบของรหัส ASCII (ตัวอักษร) เช่น A, B,…,Z, a,
b,…,z, 0,1,…, 9 และอักษรพิเศษ
• โดยทีส
่ ายขอมู
นบรรทัดๆ แตละ
้ ลตัวอักษรจะแบงออกเป็
่
่
บรรทัดปิ ดทายด
วยรหั
ส \n
้
้
 สายขอมู
้ ลไบนารี่ (Binary Stream)
• เป็ นสายขอมู
เช่น intger, real, complex ซึง่
้ ลชนิดตางๆ
่
ข้อมูลตางๆเหล
านี
ปแบบทีค
่ อมพิวเตอรจะเข
าใจ
่
่ ้จะเก็บอยูในรู
่
้
์
เช่น 2’s Complement
Basic Knowledge of Text File
File เป็ นสิ่ งทีม
่ ช
ี อ
ื่ และ Operating System รู้จัก
Stream เป็ นสิ่ งทีม
่ ช
ี อ
ื่ เหมือนกัน โดยที่ Stream ถูก
สร้างโดยโปรแกรม
ในการประมวลผลหรือทางานเกีย
่ วกับไฟลจะต
้องมีการ
์
เชือ
่ มโยงระหวาง
Stream และ File เข้าดวยกั
น
่
้
Text File Process
ขัน
้ ตอนการทางานในการประมวลผลเกีย
่ วกับไฟล ์
ประกอบดวย
4 ขัน
้ ตอนหลัก คือ
้
• ทาการสราง
File Stream Pointer
้
• ตัวอยางค
าสั่ ง File* fp;
่
• ทาการเปิ ดไฟลโดยการเชื
อ
่ ม File Name เข้ากับชือ
่
์
ของ Stream Name
• ตัวอยางค
าสั่ ง fp = fopen(“c:\\MyFile.DAT”,”r”);
่
• ทาการอานหรื
อบันทึกขอมู
อ
่
่
้ ลลงไฟลผ
่
์ านทางชื
Stream
• ตัวอยางค
าสั่ ง fscanf(fp,”%d %d
่
%d”,&date,&month,&year);
Outline
1
Text File
2p
Open Text File
3
Close Text File
4
Read Text File
5
Write Text File
How to open file?
FILE* fp;
fp = fopen("name", "mode");
FILE
คือ ประเภทขอมู
ก
่ าหนดไว้
้ ลแบบโครงสรางที
้
ให้แลวใน
stdio.h
้
*
คือ เครือ
่ งหมายทีแ
่ สดงวาเป็
่ นตัวแปร Pointer
fp คือ ชือ
่ ตัวแปรพอยนเตอร
ไปยั
งไฟล ์ Stream (file
์
์
stream pointer)
name
คือ ชือ
่ ของไฟลที
่ าการเปิ ด
์ ท
mode
คือ โหมดของการจัดการกับไฟล ์
หมายเหตุ ชือ่ ของ file stream pointer ทีร่ ะบบกาหนดให้
แลวใน
stdio.h ไดแก
้
้ ่ stdin (standard input stream), stdout
(standard output stream) และ stderr (standard error
Mode of File Management
•r
เป็ นการเปิ ดเท็กซไฟล
เพื
่ อาน
(Read)
่
์
์ อ
ถ้าไมมี
่ ไฟลอยู
่ จะเกิดสถานะ fail
์ ก็
EO
F
File Stream Pointer
Mode of File Management (cont.)
•w
เป็ นการสรางไฟล
เพื
่ เขียน (Write)
้
์ อ
ถ้าไฟลนั
อมู
่ วจะลบข
้
้ ลเดิมทัง้ หมด
์ ้นมีอยูแล
ถ้าไมมี
กซไฟล
ใหม
่ ไฟลนั
้
่
์ ้นจะทาการสรางเท็
์
์
EO
F
File Stream Pointer
Mode of File Management (cont.)
•a
เป็ นการ เปิ ด หรือ สร้าง ไฟลเพื
่ เขียนเพิม
่
์ อ
(Append)
ถ้าไฟลนั
นการเขียนขอมู
่ วจะเป็
้
้ ลตอท
่ าย
้
์ ้นมีอยูแล
ถ้าไมมี
กซไฟล
ใหม
่ ไฟลนั
้
่
์ ้นจะทาการสรางเท็
์
์
EO
F
File Stream Pointer
Mode of File Management (cont.)
• r+
เป็ นการเปิ ดไฟลเพื
่ Update (อานและเขี
ยนขอมู
่
้ ล)
์ อ
ถ้าไมมี
่ ไฟลอยู
่ จะเกิดสถานะ fail
์ ก็
ตัวชีต
้ าแหน่งจะชีไ้ ปทีต
่ าแหน่งเริม
่ ต้นของไฟล ์
• w+
เป็ นการสรางไฟล
เพื
่ Update (อานและ
้
่
์ อ
เขียนขอมู
้ ล)
ถ้าไฟลนั
อมู
่ วจะลบข
้
้ ลเดิมทัง้ หมด
์ ้นมีอยูแล
ถ้าไมมี
กซไฟล
ใหม
่ ไฟลนั
้
่
์ ้นจะทาการสรางเท็
์
์
เพือ
่ Update
• a+ เป็ นการเปิ ดหรือสรางไฟล
เพื
่ Update (อานและ
้
่
์ อ
เขียนขอมู
้ ล)
ถ้าไฟลนั
ยนจะเขียนตอท
่ วการเขี
้
่ าย
้
์ ้นมีอยูแล
Example 1
จงเขียนโปรแกรมเพือ
่ เปิ ดไฟลข
้ ล
์ อมู
• ใช้โปรแกรม Notepad สร้างไฟลข
้ ล
์ อมู
• บันทึกเป็ นชือ
่ test.txt เก็บไวที
้ ่ C:\Temp\
• เขียนโปรแกรมเพือ
่ เปิ ดไฟลข
้ ล
์ อมู
Wrong Directory
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *fp;
fp = fopen(“test.txt","r");
if (fp == NULL)
{ printf("Cannot open file\n");
return 0;
}
else
printf("Can open file\n");
return 0;
}
กรณีทไี่ ฟล์ test.txt
ไม่ ได้ อยู่ที่ Directory เดียวกับ
โปรแกรม
Cannot open file
Correct Directory
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *fp;
fp = fopen("C:/Temp/test.txt","r");
if (fp == NULL)
{ printf("Cannot open file\n");
return 0;
}
else
printf("Can open file\n");
return 0;
}
Can open file_
Outline
1
Text File
2p
Open Text File
3
Close Text File
4
Read Text File
5
Write Text File
How to close file ?
fclose (fp);
fp
คือ ตัวแปรพอยนเตอร
ที
่ ไี้ ปยังไฟลสตรี
ม
์
์ ช
์
ผลลัพธของฟั
งกชั
่ fclose() หากสามารถปิ ดไฟลได
์
์ น
์ ้
สาเร็จจะ return คา่ 0 กลับ แตหากไม
ส
่
่ าเร็จจะ return
คา่ EOF (โดยปกติคอ
ื คา่ -1)
Open & Close File Example
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *fp;
fp = fopen("C:/Temp/test.txt","r");
if (fp == NULL)
{ printf("Cannot open file\n");
return 0;
}
printf("Can open file\n");
if (!fclose(fp))
printf("\nClose file\n");
return 0;
}
Can open file
Close file
_
Outline
1
Text File
2p
Open Text File
3
Close Text File
4
Read Data Stream
5
Write Data Stream
Read Text File Format
fscanf (fp,"format",&variable);
fp
คือตัวแปรพอยนเตอร
ที
่ ไี้ ปยังไฟล ์ Stream
์
์ ช
format คือ การกาหนดรูปแบบในการอานข
อมู
่
้ ล
ขึน
้ มาจากไฟล ์
เช่น อานข
อมู
่
้ ลเป็ นชนิด int หรือ
double
variable คือ ตัวแปรทีเ่ ก็บคาข
่ อมู
้ ลจากไฟล ์ (จะต้อง
กาหนด
แอดเดรสของตัว
แปรโดยใช้สั ญลักษณ ์ & เสมอ)
Example 2
จงเขียนโปรแกรมเพือ
่ เปิ ดไฟลข
่ อานข
อมู
้ ลเพือ
่
้ ลและ
์ อมู
แสดงผล
• ใช้โปรแกรม Notepad สร้างไฟลข
้ ล
์ อมู
• บันทึกเป็ น test.txt เก็บไวที
้ ่ C:\Temp\
Read Single String
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *fp;
char str[8];
fp = fopen("C:/Temp/test.txt","r");
if (fp == NULL)
{
printf("Cannot open file\n");
return 0;
}
printf("Can open file\n");
//read data to str variable
fscanf(fp,"%s",str);
if (!fclose(fp))
printf("\nClose file\n");
printf("%s",str);
return 0;
}
Can open file
Close file
_226101_
_
Read Sentence
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *fp;
char str1[8],str2[2],str3[14];
fp = fopen("C:/Temp/test.txt","r");
if (fp == NULL)
{
printf("Cannot open file\n");
return 0;
}
printf("Can open file\n");
//read data to str variable
fscanf(fp,"%s%s%s",str1,str2,str3);
if (!fclose(fp))
{
printf("\nClose file\n");
}
printf("%s %s %s",str1,str2,str3);
}
_226101 C Programming
_
Read Character
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *fp;
char ch1,ch2,ch3;
fp = fopen("C:/Temp/test.txt","r");
if (fp == NULL)
{
printf("Cannot open file\n");
return 0;
}
printf("Can open file\n");
fscanf(fp,"%c%c%c",&ch1,&ch2,&ch3);
if (!fclose(fp))
{
printf("\nClose file\n");
}
printf("%c%c%c",ch1,ch2,ch3);
return 0;
}
Pro
_
Read Text File (String & Integer)
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *fp;
char str1[2],str2[14];
long int num;
fp = fopen("C:/Temp/test.txt","r");
if (fp == NULL)
{
printf("Cannot open file\n");
return 0;
}
printf("Can open file\n");
fscanf(fp,"%lu%s%s",&num,str1,str2);
_226101
if (!fclose(fp))
{
_
printf("\nClose file\n");
}
printf("%lu %s %s",num,str1,str2);
return 0;
}
C Programming
Outline
1
Text File
2p
Open Text File
3
Close Text File
4
Read Data Stream
5
Write Data Stream
Write Text File Format
fprintf (fp,"format",value);
fp
คือตัวแปรพอยนเตอร
ที
่ ไี้ ปยังไฟล ์ Stream
์
์ ช
format คือ การกาหนดรูปแบบของขอมู
่ ะเขียนลง
้ ลทีจ
ไฟล ์
variable คือ คาที
่ ้องการเขียนลงไฟล ์ (ไมต
่ ต
่ ้องมี & )
Example 3
จงเขียนโปรแกรม
1. เพือ
่ รับขอมู
่ และอายุของคน 3 คน
้ ล ชือ
2. เก็บขอมู
้ ลใน C:\Temp\new.txt
3. นาข้อมูลจากไฟลมาแสดงผล
์
* หลังจากนั้นให้เปิ ดไฟล ์ new.txt เพือ
่ ตรวจสอบผล
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *fp;
char name[20],ch;
int age,count=0;
fp = fopen("C:/Temp/new.txt","w");
if (fp == NULL)
{
printf("Cannot open file\n");
return 0;
}
printf("Can open file (write)\n");
/*input data in program & write on file*/
while(count<3)
{
printf ("Enter name : ");
scanf ("%s",name);
printf ("Enter age : ");
scanf ("%d",&age);
fprintf (fp,"%-20s %d\n",name,age);
count++;
}
if (!fclose(fp))
printf("\nClose file\n");
fp = fopen("C:/Temp/new.txt","r");
if (fp == NULL)
{
printf("Cannot open file\n");
return 0;
}
printf("Can open file (read)\n");
// Print data by each character
do
{
ch = getc(fp);
printf("%c",ch);
} while (ch!=EOF);
if (!fclose(fp))
printf("\nClose file\n");
return 0;
}
Outline
1
Text File
2p
Open Text File
3
Close Text File
4
Read Binary Stream
5
Write Binary Stream
Read Structure or Array from Binary Stream
int fread(dest,size,items,stream);
dest คือ ตาแหน่งของตัวแปร Structure หรือ Array ที่
ใช้เก็บคาที
่ านจากไฟล
่ อ
่
์
size คือ ขนาดของตัวแปร Structure หรือ Array ที่
ต้องการอานเข
ามา
่
้
items
คือ จานวนของ Structure หรือ Array ที่
ต้องการจะอานจากไฟล
่
์
หมายเหตุ
return คาเป็
นจทีานวน
bytes
ทีอ
่ านได
่ เตอร
่
้
stream : fread
คือ จะ
ตัวแปรพอยน
ช
่
ไ
ี
้
ปยั
ง
ไฟล
์
์
์
และจะ
return 0 มันทาการอานจนถึ
งตาแหน่งสุดทายของไฟล
่
้
์
Stream
Example 5
int main()
{ FILE *fptr;
struct student
{
char name[20];
char ID[9];
int age;
}s;
Name: Kmitl
ID: 48010000 and Age: 45
--------------------------------
fptr = fopen("StRecord.txt", "r");
if (fptr == (FILE *)NULL) printf("Cannot open file\n");
else
while (fread(&s,sizeof(struct student),1,fptr)!=0)
{ printf("Name: %s\n", s.name);
printf("ID: %s and Age: %d\n", s.ID,s.age);
printf("---------------------------------\n");
}
fclose(fptr);
return 0;
}
Outline
1
Text File
2p
Open Text File
3
Close Text File
4
Read Binary Stream
5
Write Binary Stream
Write Structure or Array into Binary Stream
int fwrite(ptr,size,items,stream);
ptr
คือ ตาแหน่งของตัวแปร Structure หรือ
Array ในหน่วยความจา (Address)
ทีต
่ ้องการจะเขียนลงไฟล ์
size คือ ขนาดของตัวแปร Structure หรือ Array
items
คือ จานวนของ Structure หรือ Array ที่
ต้องการจะเขียนลงไฟล ์
stream
คือ ตัวแปรพอยนเตอร
ที
่ ไี้ ปยังไฟล ์
์
์ ช
Stream
Example 4
int main()
Name : Kmitl
{
ID : 48010000
FILE *fptr;
struct student { Age : 45_
char name[20];
char ID[9];
int age;
} s;
fptr = fopen("StRecord.txt", "w");
printf("Name : "); scanf("%s",s.name);
printf("ID : ");
scanf("%s",s.ID);
printf("Age : "); scanf("%d",&s.age);
fwrite(&s, sizeof(struct student), 1, fptr);
fclose(fptr);
return 0;
}
Reposition Stream Position Indicator
int fseek(stream, offset, where);
stream
คือ ตัวแปรพอยนเตอร
ที
่ ไี้ ปยังไฟล ์
์
์ ช
Stream
offset คือ ระยะทีต
่ ้องการให้ตัวชีต
้ าแหน่งในไฟลเคลื
่ นไป
์ อ
ในแตละครั
ง้
่
where
เป็ นกาหนดตาแหน่งของตัวชีต
้ าแหน่งในไฟล ์
มีได้ 3 คาคื
่ อ
0 : ตัวชีต
้ าแหน่งในไฟลเริ
่ ต้นทีต
่ าแหน่งแรกสุดของ
์ ม
: fseek ไฟล
จะ ์ return 0 ถ้าสามารถเลือ
่ นตัวชีต
้ าแหน่งในไฟลได
้ าเ
์ ส
า int1ใด
ทีไ่ มงในไฟล
เท
0ม
เมืนที
อ
่ ดต
าเนิ
นการตาม
paramete
่่ ากั
่ บ เริ
: ตัวๆชีต
้ าแหน
่
ต
่
าแหน
งปั
จ
จุ
บ
น
ั
้
่
์
2 : ตัวชีต
้ าแหนงในไฟลเริม
่ ตนทีต
่ าแหนงสุดทายของ
Example 6
FILE *fptr; int noffset;
struct student {
char name[20];
char ID[9];
int age;
} s;
fptr = fopen("StRecord.txt", "w");
strcpy (s.name,"Student A"); strcpy (s.ID,"48010000");
s.age = 17;
fwrite(&s, sizeof(struct student), 1, fptr);
strcpy (s.name,"Student B"); strcpy (s.ID,"48012000");
s.age = 18;
fwrite(&s, sizeof(struct student), 1, fptr);
strcpy (s.name,"Student C"); strcpy (s.ID,"48015000");
s.age = 20;
fwrite(&s, sizeof(struct student), 1, fptr);
fclose(fptr);
Example 6 (cont.)
fptr = fopen("StRecord.txt", "r");
noffset = 0 * sizeof(struct student);
if (fseek( fptr, noffset, 0) == 0 )
{ if (fread(&s,sizeof(struct student),1,fptr) != 0)
{ printf("Name: %s\n", s.name);
printf("ID: %s and Age: %d\n", s.ID,s.age);
printf("---------------------------------\n");
}
}
fclose(fptr);
Name: Student A
ID: 48010000 and Age: 17
---------------------------------
Example 6 (cont.)
fptr = fopen("StRecord.txt", "r");
noffset = 1 * sizeof(struct student);
if (fseek( fptr, noffset, 0) == 0 )
{ if (fread(&s,sizeof(struct student),1,fptr) != 0)
{ printf("Name: %s\n", s.name);
printf("ID: %s and Age: %d\n", s.ID,s.age);
printf("---------------------------------\n");
}
}
fclose(fptr);
Name: Student B
ID: 48012000 and Age: 18
---------------------------------
Example 6 (cont.)
fptr = fopen("StRecord.txt", "r");
noffset = 2 * sizeof(struct student);
if (fseek( fptr, noffset, 0) == 0 )
{ if (fread(&s,sizeof(struct student),1,fptr) != 0)
{ printf("Name: %s\n", s.name);
printf("ID: %s and Age: %d\n", s.ID,s.age);
printf("---------------------------------\n");
}
}
fclose(fptr);
Name: Student C
ID: 48015000 and Age: 20
---------------------------------
Summary Read & Write Function
การอ่ านและเขียนข้ อมูลตามชนิดของข้ อมูล
fscanf (fp,"format",&variable);
fprintf (fp,"format",value);
การอ่ านและเขียนข้ อมูลจาก Array ชี้โดย ptr
fread(*ptr,size,items,*stream);
fwrite(*ptr,size,items,*stream);
The Other Function of Text File
การอ่ านและเขียนข้ อมูลตัวอักษร
var = fgetc(fp); //var = getc(fp);
fputc (ch,fp); //putc (ch,fp);
คาสั่ ง getchar() และ putchar()
ใช้ ได้ กบั สตรีม stdin และ stdout เท่ านั้น
การอ่ านและเขียนข้ อมูลทีเ่ ป็ นข้ อความ
fgets(var,length,fp);
fputs (str,fp);
การอ่ านจะอ่ านข้ อความขนาดไม่ เกิน length-1
#include<stdio.h>
#include<conio.h>
FILE * file_open(char[],char[]);
void file_close(FILE *);
FILE * file_open(char filename[],char mode[])
{
FILE *fp;
fp = fopen(filename,mode);
if (fp == NULL)
{
printf("Cannot open file\n");
return (NULL);
}
printf("Can open file\n");
return (fp);
}
void file_close(FILE *fp)
{
if (!fclose(fp))
printf("\nClose file\n");
}
int main()
{
char file[]="Text.txt";
char mode[]="r";
FILE *fp;
fp = file_open(file,mode);
file_close(fp);
return 0;
}
//Filename
//mode
//File pointer
Assignment
ให้นิสิตเขียนโปรแกรมเพือ
่ ทาการ
คัดลอกขอมู
้ ลจากไฟลที
์ เ่ ป็ น Binary
ตนทางไปยั
งไฟลปลายทาง
โดย
้
์
สามารถรับชือ
่ ไฟลทั
้
์ ง้ ตนทางและ
กาหนดชือ
่ ไฟลปลายทางได
้
์