Các kiáu truy cập táp tin

Một phần của tài liệu Bài giảng kỹ thuật lập trình c (Trang 68 - 78)

Chú ý: Trong các kiáu đác ghi, ta nên làm s¿ch vùng đám tr°ãc khi chuyán từ đác sang ghi hoặc ng°ÿc l¿i. Ta sẽ đß cập đến các hàm vãi tính năng xố sau này.

5.3.2. Đóng táp - hàm fclose:

CÃu trúc ngā pháp của hàm: int fclose(FILE *fp);

Trong đó: fp là con trỏ ứng vãi táp cÅn đóng.

Cơng dāng: Hàm dùng đá đóng táp khi kết thúc các thao tác trên nó. Khi đóng táp, máy thực hián các công viác sau:

 Khi đang ghi dā liáu thì máy sẽ đẩy dā liáu còn trong vùng đám lên đĩa

 Khi đang đác dā liáu thì máy sẽ xố vùng đám

 GiÁi phóng biến trỏ táp.

 Nếu lánh thành công, hàm sẽ cho giá trß 0, trái l¿i nó cho hàm EOF.

Ví dā: fclose(f);

5.3.3. Đóng tÃt cÁ các táp đang mở- hàm fcloseall:

CÃu trúc ngā pháp của hàm: int fcloseall(void);

Cơng dāng: Hàm dùng đá đóng tt c cỏc tỏp ang mỗ. Nu lỏnh thnh cụng, hàm sẽ

cho giá trß bằng số là số táp đ°ÿc đóng, trái l¿i nó cho hàm EOF.

Ví dā: fcloseall();

CÃu trúc ngā pháp của hàm: int fwrite(void *ptr, int size, int n, FILE *fp);

Trong đó: ptr là con trỏ trỏ tãi vùng nhã chứa dā liáu cÅn ghi.

size là kích th°ãc của mẫu tin theo byte

n là số mẫu tin cÅn ghi fp là con trỏ táp

Cơng dāng: Hàm ghi n mẫu tin kích th°ãc size byte từ vùng nhã ptr lên táp fp. Hàm sẽ trÁ vß mát giá trß bằng số mẫu tin thực sự ghi đ°ÿc.

Ví dā: #include <stdio.h> typedef struct { int i; char ch; }MyStruct; main() { FILE *stream; MyStruct s;

stream = fopen("TEST.TXT", "wb") // Mỗ tỏp TEST.TXT s.i = 0;

s.ch = 'A';

fwrite(&s, sizeof(s), 1, stream); // Viết cÃu trúc vào táp fclose(stream); // Đóng táp

return 0; }

5.3.5. Đãc các m¿u tin từ táp - hàm fread:

CÃu trúc ngā pháp của hàm: int fread(void *ptr, int size, int n, FILE *fp);

Trong đó:

size là kích th°ãc của mẫu tin theo byte

n là số mẫu tin cÅn đác

fp là con trỏ táp

Công dāng: Hàm đác n mẫu tin kích th°ãc size byte từ táp fp lên lên vùng nhã ptr. Hàm sẽ trÁ vß mát giá trß bằng số mẫu tin thực sự đác đ°ÿc.

Ví dā: #include <string.h> #include <stdio.h> main() { FILE *stream;

char msg[] = "Kiám tra";

char buf[20];

stream = fopen("DUMMY.FIL", "w+");

// Viết vài dā liáu lên táp

fwrite(msg, strlen(msg)+1, 1, stream);

// Tìm điám đÅu của file

fseek(stream, SEEK_SET, 0);

// Đác số liáu và hián thß

fread(buf, strlen(msg)+1, 1, stream); printf("%s\n", buf); fclose(stream); return 0; } Ví dā: #include <stdio.h> typedef struct { int i;

char ch; }MyStruct; main() { FILE *stream; MyStruct t; stream = fopen("TEST.TXT", "rb"); fread(&t, sizeof(t), 1, stream); printf("\n%d, %c", t.i, t.ch); fclose(stream); return 0; } 5.3.6. NhÁp xuÃt ký tự: Các hàm putc và fputc: CÃu trúc ngā pháp:

int putc(int ch, FILE *fp); int fputc(int ch, FILE *fp);

Trong đó:

ch là mát giá trß ngun fp là mát con trỏ táp.

Cơng dāng:Hàm ghi lên táp fp mát ký tự có mã bằng m=ch % 256.

ch đ°ÿc xem là mát giá trß ngun khơng dÃu. Nếu thành cơng hàm cho mã ký tự đ°ÿc

ghi, trái l¿i cho EOF

Ví dā:

#include <stdio.h> main() {

char msg[] = "Hello world\n"; int i = 0;

while (msg[i])

putc(msg[i++], stdout); // stdout thiết bß ra chuẩn - Màn hình return 0;

} Các hàm getc và fgettc: CÃu trúc ngā pháp: int gretc(FILE *fp); int fputc(FILE *fp); Trong đó: fp là mát con trỏ táp.

Công dāng: Hàm đác mát ký tự từ táp fp. Nếu thành cơng hàm sẽ cho mã đác đ°ÿc (có

giá trß từ 0 đến 255). Nếu gặp cuối táp hay có lßi hàm sẽ trÁ vß EOF.

Trong kiáu văn bÁn, hàm đác mát l°ÿt cÁ hai mã 13, 10 và trÁ vß giá trß 10. Khi gặp mã 26 hàm sẽ trÁ vß EOF. Ví dā: #include <string.h> #include <stdio.h> main() { FILE *stream;

char string[] = "Kiem tra"; char ch;

stream = fopen("DUMMY.FIL", "w+"); // Mỗ tỏp ỏ cp nht fwrite(string, strlen(string), 1, stream); //Viết mát xâu ký tự vào táp fseek(stream, 0, SEEK_SET); // Tìm vß trí đÅu của táp

do{ ch = fgetc(stream); // Đác mát ký tự từ táp putch(ch); // Hián thß ký tự } while (ch != EOF); fclose(stream); return 0; }

5.3.7. Hàm fprintf, fscanf

+ Hàm fprintf(FILE *fp, const char *dk, ...);

Công dāng của hai hàm này: ghi mát ký tự lên tập fp theo khuôn d¿ng đ°ÿc xác đßnh trong chi đißu khiỏn dk. Chi dk v danh sỏch i tÂng t hàm printf( ).

+ Hàm int fscanf ( FILE *fp, const char *dk, ...);

Công dāng : đác dā liáu từ tập tin fp theo khuôn d¿ng (đặc tÁ) làm viác giống scanf( ). *Ví dā : giÁ sÿ có file c:\data.txt l°u 10 số nguyên 1 5 7 9 8 0 4 3 15 20. Hãy đác các số

nguyên thêm vào mát mãng sau đó sắp xếp tăng dÅn rồi ghi vào file datasx.txt #include <stdio.h>

#include<stdlib.h> #define n 10 main ( ) {

FILE *fp ; int i, j, t, a[n];

fp = fopen (" c :\\data.txt ", "rt" ); /* mỗ file đá đác vào mÁng */

if (fp == NULL){ printf ("khụng mỗ c file "); exit (1); } /*đác file*/ i = 0; while (1){ fscanf (fp,"%d",&a[i] ); i++; if (foef(fp) ) break ; } /* Sắp xếp mÁng */

for (j=i+1; j<n ; j++) if (a[i]<a[j] )

{ t = a[i] ; a[i]=a[j] ; a[j] = t ; } fclose (fp);

/* mỗ file datasx.txt đá ghi sau khi sắp xếp */

fp = fopen ("c:\\datasx.txt ", "wt"); for ( i=0 ; i<n; i++)

fprintf (fp,"%6d", a[i] ); fclose (fp);

}

5.4. Các hàm khác

5.4.1 Làm s¿ch vùng đám - hàm fflush:

CÃu trúc ngā pháp của hàm: int fflush(FILE *fp);

Công dāng: Dùng làm s¿ch vùng đám của táp fp. Nếu lánh thành công, hàm sẽ cho giá trß 0, trái l¿i nó cho hàm EOF.

Ví dā: fflush(f);

5.4.2 Làm s¿ch vùng đám của các táp đang mở - hàm fflushall:

CÃu trúc ngā pháp của hàm: int fflushall(void);

Công dāng: Dùng làm s¿ch vùng đám của tt c cỏc tỏp ang mỗ. Nu lỏnh thnh cụng, hàm sẽ cho giá trß bằng số các táp đang mỗ, trái l¿i nó cho hàm EOF.

Ví dā: fflushall();

5.4.3. Kiám tra lỗi file - hàm ferror:

CÃu trúc ngā pháp của hàm: int ferror(FILE *fp);

Trong đó fp là con trỏ táp.

Cơng dāng: Hàm dùng đá kiám tra lßi khi thao tác trên táp fp. Hàm cho giá trß 0 nếu khơng có lßi, trái l¿i hàm cho giá trß khác 0.

5.4.4. Kiámtra cuái táp - hàm feof:

Trong đó fp là con trỏ táp.

Công dāng: Hàm dùng đá kiám tra cuối táp. Hàm cho giá trß khác 0 nếu gặp cuối táp khi đác, trái l¿i hàm cho giá trß 0.

5.4.5. Truy nhÁp ng¿u nhiên - các hàm di chuyên con trß chß vá: a) Chuyán con trß chß vá vß đầu táp - Hàm rewind:

CÃu trúc ngā pháp: void rewind(FILE *fp);

Trong đó fp là con trỏ táp.

Cơng dāng: Chun con trỏ chỉ vß của táp fp vß đÅu táp. Khi đó viác nhập xuÃt trên táp fp đ°ÿc thực hián từ đÅu.

Ví dā: rewind(f);

b) Chun con trß chß vá trí cần thiÁt - Hàm fseek:

CÃu trúc ngā pháp: int fseek(FILE *fp, long sb, int xp);

Trong đó : fp là con trỏ táp, sb là số byte cÅn di chun, xp cho biết vß trí xt phát mà viác dßch chun đ°ÿc bắt đÅu từ đó.

xp có thá nhận các giá trß sau:

xp=SEEK_SET hay 0: XuÃt phát từ đÅu táp.

xp=SEEK_CUR hay 1: Xt phát từ vß trí hián t¿i của con trỏ chỉ vß.

xp=SEEK_END hay 2: XuÃt phát từ cuối táp.

Công dāng: Chun con trỏ chỉ vß của táp fp vị vò trớ xỏc ònh bỗi xp qua mỏt số byte xác đßnh bằng giá trß tuyát đối của sb. Chißu di chuyán là vò cui tỏp nu sb dÂng, trái l¿i nó sẽ di chun vß đÅu táp. Khi thành cơng, hàm trÁ vß giá trß 0. Khi có lßi hàm trÁ vß giá trß

khác khơng.

Chú ý: Khơng nên dùng fseek trên táp tin văn bÁn, do sự chuyán đổi ký tự sẽ làm cho

viác đßnh vß thiếu chính xác.

Ví dā: fseek(stream, SEEK_SET, 0);

c) Vá trí hián t¿i của con trß chß vá - Hàm ftell:

CÃu trúc ngā pháp: int ftell(FILE *fp);

Cơng dāng: Hàm cho biết vß trí hián t¿i của con trỏ chỉ vß (byte thứ mÃy trên táp fp) khi

thành cơng. Số thứ tự tính từ 0. Trái l¿i hàm cho giá trß -1L.

Ví dā: Sau lánh fseek(fp, 0, SEEK_END);

ftell(fp) cho giá trß 3.

Sau lánh fseek(fp, -1, SEEK_END);

ftell(fp) cho giá trß 2.

5.4.6. Xố táp - hàm unlink:

CÃu trúc ngā pháp: int unlink(const char *tên_táp)

Nguyên hàm trong: dos.h, io.h, stdio.h .

Trong đó: tên_táp là tên của táp cÅn xố.

Cơng dāng: Dùng đá xố mát táp trên đĩa. Nếu thành cơng, hàm cho giá trß 0, trái l¿i hàm cho giá trß EOF.

Ví dā: #include <stdio.h> #include <io.h> int main( ) { FILE *fp = fopen("junk.jnk", "w"); int status; fprintf(fp, "junk"); status = access("junk.jnk", 0);

if (status == 0) printf("Táp tồn t¿i\n"); else printf("Táp không tồn t¿i\n"); fclose(fp);

unlink("junk.jnk");

status = access("junk.jnk", 0);

if (status == 0) printf("Táp tồn t¿i\n"); else printf("Táp không tồn t¿i\n");

return 0; }

Bài tÁp

1. Viết ch°¢ng trình ghi mát dãy số ngun vào file <bai1.inp=

2. Viết ch°¢ng trình ỏc d liỏu t file <bai1.inp= ỗ bi 1 v in kết quÁ đác đ°ÿc lên

màn hình

3. Vit chÂng trỡnh ỏc d liỏu t file <bai1.inp= ỗ bài 1 và ghi kết quÁ đác đ°ÿc vào file <bai2.inp=

4. Ghi danh sách n sinh viên vào file <list.txt=. Thông tin của sv gồm tên, mã, điám tổng kết.

TÀI LIàU THAM KHÀO 1. Các tài liáu tiÁng Viát:

1.1. Ph¿m Văn Ât, Kỹ thuật lập trình C - CÂ sỗ v nõng cao, NXB KHKT, 2008.

1.2. Vián tin hác - Ngôn ngā lập trình C Hà nái 1990

1.3. Lê Văn Doanh - 101 thuật tốn và ch°¢ng trình bằng ngơn ngā C

2. Các tài liáu tiÁng Anh:

2.1. B. Kernighan and D. Ritchie - The C programming language - Prentice Hall 1989 2.2. Programmer's guide Borland C++ Version 4.0 - Borland International, Inc 1993 2.3. Bile - Nabaiyoti - TURBO C++ - The Waite Group's UNIX 1991

Một phần của tài liệu Bài giảng kỹ thuật lập trình c (Trang 68 - 78)