49
Laboratory 2 File Access

Laboratory 2

Embed Size (px)

DESCRIPTION

Laboratory 2. File Access. เกริ่นนำ. การเขียนโปรแกรมของเราที่ผ่านมาจะนำข้อมูลเข้าผ่านทางอุปกรณ์รับข้อมูลมาตรฐานหรือคีย์บอร์ดนั่นเอง และส่งผลจากการประมวลผลใดๆ ออกทางอุปกรณ์แสดงผลมาตรฐานหรือหน้าจอคอมพิวเตอร์ - PowerPoint PPT Presentation

Citation preview

Laboratory 2

File Access

2

เกริน่นำ�

• ก�รเขยีนโปรแกรมของเร�ท่ีผ่�นม�จะนำ�ขอ้มูลเข�้ผ่�น ท�งอุปกรณ์รบัขอ้มูลม�ตรฐ�นหรอืคียบ์อรด์นัน่เอง

และสง่ผลจ�กก�รประมวลผลใดๆ ออกท�งอุปกรณ์แสดงผลม�ตรฐ�นหรอืหน้�จอคอมพวิเตอร์

• อีกท�งของรบัขอ้มูลและแสดงผลขอ้มูล คือเร� ส�ม�รถนำ�เข�้ขอ้มูลท่ีเก็บอยูใ่นไฟล์ และแสดงผลของ

ก�รดำ�เนินง�นเก็บไวใ้นไฟล์• ซึ่งบทน้ีเร�จะเรยีนคำ�สัง่ภ�ษ�ซเีก่ียวกับก�รติดต่อกับ

ไฟล์

3

หลักก�รประมวลผลกับไฟล์

Buffer

Operating SystemC programming

File pointer

ไฟล์ท่ีเก็บในฮ�รด์ดิสก์

4

บฟัเฟอร์

• บฟัเฟอรคื์อพื้นท่ีในหน่วยคว�มจำ�หลัก (memory) ของเครื่องคอมพวิเตอร ์ซึ่งเตรยีมไวส้ำ�หรบัประมวลผลกับไฟล์ ถ้�ทำ�ก�รประมวลผลกับหล�ยๆ ไฟล์ แต่ละไฟล์ก็จะมบีฟัเฟอรเ์ฉพ�ะสำ�หรบัไฟล์นัน้ตัวอย�่ง

ถ้�เร�ประมวลผลกับไฟล์ชื่อ A, B และ C พื้นที่ในหน่วยคว�มจำ�จะถกูกำ�หนดแยกเอ�ไว ้3 สว่นด้วยกันเพื่อใหเ้ป็นบฟัเฟอรข์องไฟล์ A, B และ C

5

โครงสร�้งของไฟล์ในภ�ษ�ซี

• จะเก็บขอ้มูลในลักษณะเรยีงต่อกันตัง้แต่ต้นจนจบไฟล์ไมม่ีก�รแบง่ชว่งของขอ้มูล ดังนัน้ก�รท่ีจะเลือกระบุขอ้มูลใดๆ ก็ต�มภ�ยในไฟล์ ต้องทร�บตำ�แหน่งของขอ้มูล ซึ่งตำ�แหน่งของขอ้มูลภ�ยในไฟล์ส�ม�รถทำ�ได้โดยใชตั้วชี้ตำ�แหน่งไฟล์ (file pointer)

• ตัวชีต้ำ�แหน่งไฟล์จะเป็นตัวบอกตำ�แหน่งภ�ยในไฟล์ โดยจะเป็นตัวบอกว�่ขณะนัน้ทำ�ก�รประมวลผลอยู ่ณ ตำ�แหน่งใด ภ�ยในไฟล์ ทำ�ใหเ้ร�ส�ม�รถกำ�หนดได้ว�่จะอ่�นหรอืเขยีนขอ้มูลโดยเริม่ต้นจ�กจุดใดและไปสิน้สดุท่ีตำ�แหน่งใดในไฟล์

6

ชนิดของไฟล์

• เท็กซไ์ฟล์ (Text File) เป็นไฟล์ท่ีเก็บขอ้มูลในรูปแบบของรหสั ascii ซึ่งก็คือเก็บเป็นตัวอักษร ทำ�ใหเ้ร�ส�ม�รถอ่�นขอ้มูลในไฟล์ประเภทนี้ได้รูเ้ร ื่อง โดยเท็กซไ์ฟล์จะมีก�รเปล่ียนรหสัก�รขึ้นบรรทัดใหม ่‘\n’ เป็น Carriage return หรอื Line feed ตัวอย�่งไฟล์ .c, .txt, .bat หรอื .dat

• ไบน�รไีฟล์ (Binary File) เป็นไฟล์ท่ีเก็บขอ้มูลในรูปแบบของเลขฐ�นสองซึ่งเป็นระบบเลขที่เครื่องคอมพวิเตอรใ์ชง้�น ดังนัน้เร�จงึไมส่�ม�รถอ่�นขอ้มูลในไฟล์ประเภทนี้ได้รูเ้ร ื่อง ตัวอย่�งไฟล์ .exe, .com หรอื .obj

7

ตัวชีต้ำ�แหน่งไฟล์ (file pointer)

• เมื่อทำ�ก�รเปิดไฟล์ขึ้นม�แล้วตัวชีต้ำ�แหน่งไฟล์จะถกูสร�้งขึ้นเพื่อชีต้ำ�แหน่งภ�ยในไฟล์นัน้

• คำ�สัง่ที่ดำ�เนินก�รกับไฟล์จะต้องใชตั้วชี้ ตำ�แหน่งไฟล์ในก�รอ้�งอิงจุดที่จะดำ�เนินก�ร

อ�ทิ คำ�สัง่เขยีน หรอื คำ�สัง่อ่�น

8

ก�รสร�้งตัวแปรพอยน์เตอร์ชนิดไฟล์

• เร�จำ�ต้องมตัีวแปรพอยน์เตอรช์นิดไฟล์เพื่อม�รบัค่�ตัวชีต้ำ�แหน่งไฟล์ท่ีเกิดขึ้นเมื่อทำ�ก�รเปิดไฟล์

• ก�รกำ�หนดตัวแปรพอยน์เตอรช์นิดไฟล์FILE *ชื่อตัวแปรพอยน์เตอรช์นิดไฟล์

ตัวอย�่งFILE *fp;

9

ก�รเปิดไฟล์

• ในก�รดำ�เนินง�นใดๆ กับไฟล์จะต้องกระทำ�สิง่แรกก่อนคือ ก�รเปิดไฟล์

• โดยตัวชีต้ำ�แหน่งไฟล์จะชีไ้ปท่ีจุดเริม่ต้นของไฟล์ท่ีทำ�ก�รเปิดนัน้ เมื่ออ่�นหรอืเขยีนขอ้มูลจ�กไฟล์ตัวชีต้ำ�แหน่งไฟล์ก็จะเล่ือนไปเรื่อยๆ ต�มจำ�นวนของขอ้มูล

• ก�รเปิดไฟล์เร�ใชฟ้งัก์ชนั fopen( ) ซึ่งเป็นไลบร�รีฟงัก์ชนัที่อยูใ่นไฟล์ stdlib.h

10

ก�รเปิดไฟล์

• รูปแบบก�รใชค้ำ�สัง่ก�รเปิดไฟล์

ชื่อตัวแปรพอยน์เตอรช์นิดไฟล์ = fopen(“ชื่อไฟล์”, “mode”)

ผลลัพธ์ถ้�ก�รเปิดไฟล์เป็นผลสำ�เรจ็ สิง่ที่ได้กลับม�ก็คือ ตัวชีต้ำ�แหน่งไฟล์ ถ้�เกิดคว�มผิดพล�ด จะสง่ค่� NULL กลับออกม�หม�ยคว�มว�่ไมส่�ม�รถเปิดไฟล์นัน้ได้

11

โหมดก�รเปิดไฟล์

r เปิดเพื่ออ่�นไฟล์เก่�w เปิดเพื่อเขยีนไฟล์ใหม ่หรอืเขยีนทับไฟล์เก่�a เปิดเพื่อเขยีนต่อท้�ยขอ้มูลสดุท้�ยของไฟล์เก่�r+ เปิดเพื่ออ่�นหรอืเขยีนทับไฟล์เก่�w+ เปิดเพื่ออ่�นหรอืเขยีนทับไฟล์เก่�หรอืไฟล์ใหม่a+ เปิดเพื่อเขยีนต่อท้�ยไฟล์เก่� หรอืเขยีนไฟล์ใหม่

รหสั คว�มหม�ย

12

ตัวอย�่ง ก�รเขยีนคำ�สัง่เพื่อเปิด เท็กซไ์ฟล์ info.txt

• ทำ�ก�รอ่�นเท็กซไ์ฟล์ ชื่อ info.txt สำ�หรบัอ่�นขอ้มูลอย�่งเดียว

FILE *fp;fp = fopen(“info.txt”, “r”);

FILE *pfile;pfile = fopen(“readme.txt”, “w”);

13

เพิม่เติม

• เร�ส�ม�รถกำ�หนดโหมดใหล้ะเอียดกว�่นี้ได้โดยระบุชนิดของไฟล์ลงไปด้วย– ถ้�เป็นเท็กซไ์ฟล์จะใชตั้วอักษร t ต่อท้�ยไฟล์ เชน่

rt, wt, at หรอื r+t, w+t, a+t– ถ้�เป็นไบน�รไีฟล์จะใชตั้วอักษร b ต่อท้�ยไฟล์ เชน่

rb, wb, ab หรอื r+b, w+b, a+b

14

ตัวอย�่งก�รเปิดไฟล์

FILE *fp;

fp = fopen(“abc.txt”, “a”);

fp = fopen(“ex5.obj”, “w”);

fp = fopen(“song.dat”, “r+t”);

fp = fopen(“prog.exe”, “a+b”);

fp = fopen(“ch1.txt”, “w+”);

เปิดเท็กซไ์ฟล์ abc.txt เพื่อเขยีนขอ้มูลต่อ

เปิดไบน�รไีฟล์ ex5.obj เพื่อเขยีนขอ้มูลทับ

เปิดเท็กซไ์ฟล์ song.dat เพื่ออ่�นขอ้มูลเปิดไบน�รไีฟล์ ex5.obj เพื่ออ่�นและเขยีนทับ

เปิดเท็กซไ์ฟล์ ch1.txt เพื่ออ่�นและเขยีนทับ

15

ตัวอย�่งก�รเปิดไฟล์

#include <stdio.h>main(){ FILE *fp; fp = fopen(“box.txt”, “r”); if (fp == NULL) { printf(“Cannot open file\n”); exit(); } fclose(fp);}

อย�่งท่ีได้กล่�วไวแ้ล้ว ก�รเปิดไฟล์จะสง่ผลลัพธก์ลับออกม�เป็นตัวชีไ้ฟล์ แต่ถ้�ก�รเปิดไฟล์ไมส่ำ�เรจ็ ค่�ท่ีสง่กลับม�คือ NULL ดังนัน้เร�จงึควรตรวจสอบให้แน่ใจว�่ทำ�ก�รเปิดไฟล์สำ�เรจ็ก่อนก�รดำ�เนินก�รใดๆ กับไฟล์

16

คว�มผิดพล�ดจ�กก�รเปิดไฟล์

• ไฟล์ท่ีต้องก�รเปิดไมม่อียูจ่รงิ ในกรณีน้ีจะเกิดขึ้นกับโหมดเปิดเพื่ออ่�นไฟล์ สว่นโหมดอ่ืนๆ จะทำ�ก�รสร�้งไฟล์ใหมห่�กไมพ่บชื่อไฟล์ท่ีกำ�หนด

• ระบุท่ีเก็บไฟล์ไมถ่กูต้อง ปรกติแล้วก�รระบุแต่ชื่อไฟล์เพยีงอย่�งเดียวจะหม�ยคว�มว�่ไฟล์ท่ีระบุจะอยู ่ณ ไดเรกทอรีท่ี่ตัวแปลภ�ษ�ซ ีแต่ถ้�เร�ต้องก�รเปิดไฟล์ ณ ไดเรกทอรีอ่ื่นใหร้ะบุ path เต็มๆ ได้

• ก�รป้องกันไฟล์อันเกิดจ�กก�รใหส้ทิธขิองผู้ดแูลระบบ

17

ตัวอย�่งก�รกำ�หนดที่อยูข่องไฟล์

FILE *fp;

fp = fopen(“C:/my_c/abc.txt”, “r”);

fp = fopen(“D:/JOBs/info.dat”, “a+”);

18

ก�รปิดไฟล์

• เมื่อเร�ได้ทำ�ก�รเปิดไฟล์แล้ว ควรจะทำ�ก�รปิดไฟล์ทกุ ครัง้ เพื่อคืนพื้นท่ีหน่วยคว�มจำ�ท่ีใชเ้ป็นบฟัเฟอรข์อง

ไฟล์ใหกั้บเครื่อง นอกจ�กน้ีเมื่อทำ�ก�รปิดไฟล์ขอ้มูล ต่�งๆ ท่ีคงค้�งในบฟัเฟอรจ์ะถกูเขยีนกลับลงในไฟล์

• รูปแบบคำ�สัง่

– ถ้�ปิดไฟล์สำ�เรจ็จะได้ค่�ศูนย์– ถ้�เปิดไฟล์ไมส่ำ�เรจ็จะได้ค่�ไมเ่ท่�กับศูนย์

fclose(ชื่อตัวชีไ้ฟล์)

19

ตัวอย�่งก�รเปิดและปิดไฟล์

#include <stdio.h>main(){ FILE *fp; int a; fp = fopen(“c:/file/song.txt”, “r”); if (fp == NULL) { printf(“Cannot open file\n”); exit(); } printf(“Can open file\n”); a = fclose(fp); if(!a) { printf(“Close file\n”); }}

Can open fileClose file

20

ก�รอ่�นขอ้มูลจ�กไฟล์

• ขอ้มูลภ�ยในไฟล์จะถกูอ่�นเริม่ต้นตัง้แต่ต้นไฟล์ โดยมตัีวชีต้ำ�แหน่งไฟล์ชีไ้ปเรื่อยๆ จนจบไฟล์

• เร�ทำ�ก�รอ่�นขอ้มูลของไฟล์จ�กบฟัเฟอร ์มใิชจ่�กไฟล์จรงิๆ

• เร�จะทำ�ก�รอ่�นไฟล์ท่ีทำ�ก�รเปิดจ�กโหมด r หรอื r+ เท่�นัน้

• คำ�สัง่ในก�รอ่�นไฟล์ มหีล�ยคำ�สัง่ อ�ทิ getc( ), fgetc( ), fgets( )

21

อ่�นขอ้มูลทีละอักขระ ด้วยgetc( )

• ฟงัก์ชนั getc( ) ใชใ้นก�รอ่�นขอ้มูลชนิดอักขระจ�กไฟล์ โดยจะอ่�นออกม�ทีละ 1 อักขระเท่�นัน้

• รูปแบบก�รเขยีนคำ�สัง่

ตัวแปรชนิดอักขระ = getc(ตัวชีไ้ฟล์)

ตัวอย�่งFILE *fp;char ch;fp = fopen(“C:/my_c/abc.txt”, “r”);ch = getc(fp);

22

#include <stdio.h>main(){ FILE *fp; char ch; fp = fopen(“info.txt”, “r”); if (fp == NULL) { printf(“Cannot open file\n”); exit(); } printf(“Can open file\n”); ch = getc(fp); printf(“%c”,ch); fclose(fp);}

ICT, Silpakron U.

ตัวอย�่งก�รใช้ getc( )

Can open fileI

23

ก�รใชง้�นจรงิของก�รอ่�นไฟล์

• ถ้�ต้องก�รอ่�นขอ้มูลจนจบไฟล์โดยใชฟ้งัก์ชนั getc() ต้องมกี�รวนลปูอ่�นทีละตัวอักษรจนหมดไฟล์

• ในกรณีของเท็กซไ์ฟล์ เร�มอัีกษรพเิศษเมื่อตัวชี้ไฟล์ชีไ้ปถึงจุดสิน้สดุไฟล์ คือ EOF เพื่อบง่บอกว�่จบไฟล์ เร�ส�ม�รถอ่�นอักขระมทีีละอักขระแล้วม�เปรยีบเทียบว�่เป็น EOF หรอืไม ่ถ้�อักษรนัน้เท่�กับ EOF ก็แสดงว�่จบไฟล์น้ีแล้ว

24

#include <stdio.h>main(){ FILE *fp; char ch; fp = fopen(“info.txt”, “r”); if (fp == NULL){ printf(“Cannot open file\n”); exit(); } printf(“Can open file\n”); ch = getc(fp); while (ch != EOF){ printf(“%c”,ch); ch = getc(fp); } fclose(fp);}

ICT, Silpakron U.

ตัวอย�่งก�รใช้ getc( )

Can open fileICT,Silpakorn U.

25

ก�รห�จุดสิน้สดุไฟล์ (End of File)

• เท็กซไ์ฟล์ เมื่ออ่�นขอ้มูลจนจบไฟล์แล้วจะใหค่้� EOF ออกม�เพื่อบอกว�่จุดสิน้สดุไฟล์

• ไบน�รไีฟล์ เมื่ออ่�นขอ้มูลจนจบไฟล์ก็ไมใ่หค่้� EOF ออกม�เหมอืนเท็กซไ์ฟล์

• ก�รตรวจสอบจุดจบของไบน�รไีฟล์ใชฟ้งัก์ชนั feof()

• ฟงัก์ชนั feof() ส�ม�รถใชไ้ด้ทัง้เท็กซไ์ฟล์และไบน�รีไฟล์

26

ฟงัก์ชนั feof()• เป็นฟงัก์ชนัเพื่อใชต้รวจสอบจุดสิน้สดุไฟล์ โดย

ส�ม�รถใชไ้ด้ทัง้เท็กซไ์ฟล์และไบน�รไีฟล์• รูปแบบก�รเขยีนคำ�สัง่

– ถ้�ยงัไมจ่บไฟล์ค่�ท่ีได้จ�กฟงัก์ชนัจะเป็นศูนย ์หรอืเท็จ– ถ้�จบไฟล์ค่�ท่ีได้จ�กฟงัก์ชนัจะไมเ่ท่�กับศูนย ์หรอืจรงิ

ตัวแปรตัวเลข = feof(ตัวชีไ้ฟล์)if ( !feof(ตัวชีไ้ฟล์) ) { . . . }

27

#include <stdio.h>main(){ FILE *fp; char ch; fp = fopen(“info.txt”, “r”); if (fp == NULL){ printf(“Cannot open file\n”); exit(); } printf(“Can open file\n”); while (!feof(fp)){ printf(“%c”,ch); ch = getc(fp); } fclose(fp);}

ICT, Silpakron U.

ตัวอย�่งก�รใช้ feof( )

Can open fileICT,Silpakorn U.

28

อ่�นขอ้มูลทีละอักขระ ด้วยfgetc( )

• ฟงัก์ชนั fgetc( ) ใชใ้นก�รอ่�นขอ้มูลชนิดอักขระจ�กไฟล์ เชน่เดียวกับฟงัก์ชนั getc( )

• รูปแบบก�รเขยีนคำ�สัง่

ตัวแปรชนิดอักขระ = fgetc(ตัวชีไ้ฟล์)ตัวอย�่ง

FILE *fp;char ch;fp = fopen(“C:/my_c/abc.txt”, “r”);ch = fgetc(fp);

29

#include <stdio.h>main(){ FILE *fp; char ch; fp = fopen(“info.txt”, “r”); if (fp == NULL){ printf(“Cannot open file\n”); exit(); } printf(“Can open file\n”); while (!feof(fp)){ printf(“%c”,ch); ch = fgetc(fp); } fclose(fp);}

ICT, Silpakron U.

ตัวอย�่งก�รใช้ fgetc() และ feof()

Can open fileICT,Silpakorn U.

30

อ่�นขอ้มูลทีละขอ้คว�มด้วยfgets()

• ฟงัก์ชนั fgets() ใชใ้นกรณีท่ีต้องก�รอ่�นขอ้มูลจ�กไฟล์ออกม�ต่อเนื่องกันเป็นขอ้คว�ม โดยส�ม�รถกำ�หนดคว�มย�วของขอ้คว�มได้

• รูปแบบของก�รเขยีนคำ�สัง่

fgets(ตัวแปรชนิดอักขระ, จำ�นวนตัวอักษร, ตัวชีไ้ฟล์)

หม�ยเหต ุจำ�นวนตัวอักษรนี้จะถกูลบออก 1 ตัวอักษรเพื่อใสตั่วอักษรจบขอ้คว�ม ‘\0’

31

#include <stdio.h>main(){ FILE *fp; char ch[50]; fp = fopen(“info.txt”, “r”); if (fp == NULL){ printf(“Cannot open file\n”); exit(); } printf(“Can open file\n”); fgets(ch,8,fp); fclose(fp); printf(“%s”,ch);}

Silpakron U.ICT Petchaburi

ตัวอย�่งก�รใช้ fgets( )

Can open fileSilpakr

32

#include <stdio.h>#define MAX 100;main(){ FILE *fp; char ch[MAX]; fp = fopen(“info.txt”, “r”); if (fp == NULL){ printf(“Cannot open file\n”); exit(); } printf(“Can open file\n”); fgets(ch,MAX,fp); fclose(fp); printf(“%s”,ch);}

Silpakron U.ICT Petchaburi

ตัวอย�่งก�รใช้ fgets( )

Can open fileSilpakron U.

33

#include <stdio.h>#define MAX 100;main(){ FILE *fp; char ch[MAX]; fp = fopen(“info.txt”, “r”); if (fp == NULL){ printf(“Cannot open file\n”); exit(); } printf(“Can open file\n”); while(!feof(fp)){ fgets(ch,MAX,fp); printf(“%s”,ch); } fclose(fp);}

Silpakron U.ICT Petchaburi

ตัวอย�่งก�รใช้ fgets() และ feof()

Can open fileSilpakron U.ICT Petchaburi

34

อ่�นขอ้มูลด้วย fscanf()

• เร�ส�ม�รถอ่�นขอ้มูลจ�กไฟล์เป็นขอ้มูลชนิด อ่ืนๆ ได้ นอกเหนือจ�กตัวอักษรหรอืขอ้คว�ม

เชน่ขอ้มูลตัวเลข เป็นต้น• รูปแบบก�รเขยีนคำ�สัง่fscanf(ตัวชีไ้ฟล์, “รูปแบบ”, &ตัวแปร)

หม�ยเหต ุ รูปแบบ จะมลัีกษณะคล้�ยกับของคำ�สัง่ “ ” scanf

35

#include <stdio.h>main(){ FILE *fp; char str[20]; fp = fopen(“info.txt”, “r”); if (fp == NULL){ printf(“Cannot open file\n”); exit(); } while(!feof(fp)){ fscanf(fp, “%s”,str); printf(“%s\n”,str); } fclose(fp);}

Silpakron U.ICT Petchaburi

ก�รอ่�นขอ้มูลชนิดขอ้คว�มจ�กไฟล์

Silpakron U.ICT Petchaburi

36

#include <stdio.h>main(){ FILE *fp; char ch; int i; fp = fopen(“info.txt”, “r”); if (fp == NULL){ printf(“Cannot open file\n”); exit(); } for (i=0;i<5;i++){ fscanf(fp, “%c”,&ch); printf(“%c\n”,ch); } fclose(fp);}

Silpakron U.ICT Petchaburi

ก�รอ่�นขอ้มูลชนิดอักขระจ�กไฟล์

Silp

37

#include <stdio.h>main(){ FILE *fp; int day,month,year; fp = fopen(“info.txt”, “r”); if (fp == NULL){ printf(“Cannot open file\n”); exit(); } fscanf(fp, “%d %d”,&day,&month); printf(“%d\n”,day); printf(“%d\n”,month); fclose(fp);}

11 3 200230 5 2003

ก�รอ่�นขอ้มูลชนิดตัวเลขจ�กไฟล์

113

38

อ่�นขอ้มูลด้วย fread()

• ฟงัก์ชนั fread ใชอ่้�นขอ้มูลเป็นเรคคอรด์หรอืเป็นชุด ซึ่งขน�ดของเรคคอรด์หรอืชุดขอ้มูลเร�เป็นผู้กำ�หนดขึ้นเองในหน่วยไบต

• รูปแบบก�รเขยีนคำ�สัง่fread(ptr, size, number, fp)

ptr คือค่�ตำ�แหน่งในหน่วยคว�มจำ� ซึ่งจะนำ�ขอ้มูลที่อ่�นได้ม�เก็บไว้size คือขน�ดของเรคคอรด์หรอืชุดขอ้มูล โดยมหีน่วยเป็นไบต์number คือจำ�นวนเรค็คอรด์หรอืชุดขอ้มูลที่จะอ่�นfp คือตัวชีต้ำ�แหน่งไฟล์ท่ีต้องก�รอ่�น

39

#include <stdio.h>main(){ FILE *fp; char str[30]; fp = fopen(“info.txt”, “r”); if (fp == NULL){ printf(“Cannot open file\n”); exit(); } fread(str, sizeof(str), 1, fp); printf(“%s\n”,str); fclose(fp);}

11 3 200230 5 2003

ตัวอย�่งก�รใช้ fread( )

11 3 2002

40

ก�รเขยีนใสล่งในไฟล์

• ก�รเขยีนหรอืบนัทึกขอ้มูลลงไฟล์ เร�จะต้องทำ�ก�รเปิดไฟล์เพื่อเขยีนได้แก่ w, w+, a, a+ และ r+

• โดยท่ีขอ้มูลท่ีเร�ดำ�เนินก�รจะถกูเขยีนลงบนบฟัเฟอรก่์อน ในระหว�่งท่ีเขยีนขอ้มูล ตัวชีไ้ฟล์จะเล่ือนตำ�แหน่งชีไ้ปเรื่อยๆ ต�มปรมิ�ณก�รเขยีน เมื่อบฟัเฟอรเ์ต็มหรอืทำ�ก�รปิดไฟล์ขอ้มูลเหล่�นัน้จงึจะถกูเขยีนลงไปในไฟล์จรงิๆ ท่ีเร�อ้�งถึงตอนเปิดไฟล์

41

เขยีนขอ้มูลด้วย putc()

• เป็นฟงัก์ชนัท่ีใชส้ำ�หรบัเขยีนขอ้มูลประเภทตัวอักขระลงในไฟล์ โดยเขยีนลงในไฟล์ครัง้ละ 1 ตัวอักษรเท่�นัน้

• รูปแบบก�รเขยีนคำ�สัง่putc( ตัวแปรหรอืค่�อักขระ, ตัวชีต้ำ�แหน่งไฟล์)ตัวอย�่ง

FILE *fp;char ch = ‘Z’;fp = fopen(“C:/my_c/abc.txt”, “w”);putc(‘A’,fp); putc(ch,fp);

42

#include <stdio.h>main(){ FILE *fp; char ch; fp = fopen(“info.txt”, “w”); printf(“wait . . .”); for(ch=‘A’,ch<=‘F’;ch++) { putc(ch, fp); } printf(“finish my task\n”); fclose(fp);}

ABCDEF

ตัวอย�่งก�รใช้ putc( )

Wait . . .Finish my task

43

เขยีนขอ้มูลด้วย fputc()

• ใชเ้ขยีนอักขระลงไฟล์เชน่เดียวกับฟงัก์ชนั putc()

• รูปแบบก�รเขยีนคำ�สัง่fputc( ตัวแปรหรอืค่�อักขระ, ตัวชีต้ำ�แหน่งไฟล์)

ตัวอย�่งFILE *fp;char ch = ‘Z’;fp = fopen(“C:/my_c/abc.txt”, “w”);fputc(‘A’,fp); fputc(ch,fp);

44

เขยีนขอ้มูลด้วย fputs()

• เป็นฟงัก์ชนัใชส้ำ�หรบัเขยีนขอ้คว�มลงในไฟล์• รูปแบบก�รเขยีนคำ�สัง่

fputs( ตัวแปรขอ้คว�มหรอืขอ้คว�ม, ตัวชีต้ำ�แหน่งไฟล์)ตัวอย�่ง

FILE *fp;char str[10] = “sawasdee”;fp = fopen(“C:/my_c/abc.txt”, “w”);fputs(“ALOHA ”,fp); fputs( str, fp );

45

#include <stdio.h>main(){ FILE *fp; int count = 0; char name[50]; if ((fp = fopen(“name.txt”, “a+”))==NULL){ printf(“can not open file\n”); exit(); } while(count<5){ printf(“Enter your name:”); gets(name); fputs(name,fp); count++; } fclose(fp);}

Name1Name2Name3Name4Name5

ตัวอย�่งก�รใช้ fputs( )

46

เขยีนขอ้มูลด้วย fprintf()

• นอกเหนือจ�กขอ้มูลท่ีเป็นขอ้คว�มท่ีเร�ส�ม�รถเขยีนลงไฟล์ได้แล้วเร�ก็ส�ม�รถเขยีน

ขอ้มูลชนิดอ่ืนๆ ลงไฟล์ได้เชน่กัน• รูปแบบก�รเขยีนคำ�สัง่

fprintf(ตัวชีต้ำ�แหน่งไฟล์, ตัวควบคมุ, ตัวแปรขอ้คว�มหรอืขอ้คว�ม)

หม�ยเหต ุ ตัวควบคมุ จะมลัีกษณะคล้�ยกับของคำ�สัง่ “ ” printf

47

#include <stdio.h>main(){ FILE *fp; char name[30]=“Awirut Nareerat”; int age = 10; char sex = ‘M’; fp = fopen(“A.txt”, “a”); fprintf(fp,“Name:%s\n”,name); fprintf(fp,“School:Wachirawut\n”); fprintf(fp,“Age:%d\n”,age); fprintf(fp,“sex:%c\n”,sex); fclose(fp);}

Name:Awirut NareeratSchool:WachirawutAge:10Sex:M

ตัวอย�่งก�รใช้ fprintf( )

48

เขยีนขอ้มูลด้วย fwrite()

• ฟงัก์ชนั fwrite ใชเ้ขยีนขอ้มูลเป็นเรคคอรด์หรอืเป็นชุด ซึ่งขน�ดของเรคคอรด์หรอืชุดขอ้มูลเร�เป็นผู้กำ�หนดขึ้นเองในหน่วยไบต

• รูปแบบก�รเขยีนคำ�สัง่fwrite(ptr, size, number, fp)

ptr คือค่�ตำ�แหน่งในหน่วยคว�มจำ� ซึ่งจะนำ�ขอ้มูลที่อ่�นได้ม�เก็บไว้size คือขน�ดของเรคคอรด์หรอืชุดขอ้มูล โดยมหีน่วยเป็นไบต์number คือจำ�นวนเรค็คอรด์หรอืชุดขอ้มูลที่จะอ่�นfp คือตัวชีต้ำ�แหน่งไฟล์ท่ีต้องก�รอ่�น

49

#include <stdio.h>

main(){ FILE *fp; char str[]=“The c is easy.”; char temp[30]; fp = fopen(“new.txt”, “w”); fwrite(str, sizeof(str), 1, fp); fp = freopen(“new.txt”, “r”); while(!feof(fp)){ fread(temp,sizeof(str),1,fp); printf(“%s”,temp); } fclose(fp);}

The c is easy.

ตัวอย�่งก�รใช้ fwrite( )

The c is easy