Ạ ƯƠ Ệ Ữ Ệ

NG TIN H C Đ I C Bài 8. T P D  LI U.

Nguy n Thành Kiên

ậ ộ

Đ ệ ễ ỹ           B  môn K  thu t máy tính        Khoa Công ngh  thông tin –  HBK HN

Ệ Ữ Ệ

Bài 8. T P D  LI U

ạ ệ

ớ ệ

 8.1. Khái ni m và phân lo i t p  8.2. Các thao tác v i t p

ậ ệ ậ ệ

 8.2.1. Khai báo  8.2.2 M  t pở ệ  8.2.3. Truy nh p t p văn b n  8.2.4. Truy nh p t p nh  phân  8.2.5. Đóng t pệ

2

Ệ Ữ Ệ

Bài 8. T P D  LI U

ạ ệ

ớ ệ

 8.1. Khái ni m và phân lo i t p  8.2. Các thao tác v i t p

ậ ệ ậ ệ

 8.2.1. Khai báo  8.2.2 M  t pở ệ  8.2.3. Truy nh p t p văn b n  8.2.4. Truy nh p t p nh  phân  8.2.5. Đóng t pệ

3

ạ ệ

8.1. Khái ni m và phân lo i t p

ữ ệ

 Khái ni m t p d  li u:

ộ ậ

ệ ệ ữ ữ ệ File) là m t t p h p các d    T p d  li u ( ể

ượ ư

ế ị

ệ ệ li u có liên quan v i nhau và có cùng ki u  ữ ệ d  li u.  ệ  T p đ

c l u tr  trên các thi

ớ t b  nh

ớ ứ ề ngoài (đĩa m m, đĩa c ng, CD­ROM…) v i  m t tên nào đó đ  phân bi

ươ

ữ ữ ệ

ệ ớ t v i nhau. ể ấ

ể ệ

ộ ệ

ng ti n dùng đ  c t gi

d  li u

 T p là ph lâu dài.

4

ạ ệ

8.1. Khái ni m và phân lo i t p

ấ ữ ệ

 Phân lo i t p: d a theo b n ch t d  li u c a

ạ ệ ạ ệ t p, chia thành 2 lo i:  T p văn b n (

ệ ả text file): là t p mà các ph n t

ư ự nh  ch  cái, ch  s , các d u

ấ ữ ộ ố ể

 T p nh  phân (

ị ầ ử   ấ ữ ố  đi u khi n   ầ ệ ủ c a nó là các kí t ự ề câu, các d u cách và m t s  kí t ệ binary file): là t p mà các ph n

ượ ở

ị ữ ệ

 N u thông tin đ

ượ ự ệ ố ử ủ  c a nó là các s  nh  phân 0 và 1 mã hóa thông  t c mã hóa b i các bit nh  phân có  tin. Thông tin đ ấ ố ự ố th  là s  nguyên, s  th c, các c u trúc d  li u…   thì khi đó t p  c mã hóa là kí t

5

ậ ệ ị ể ế ị ả ệ ợ ệ ở nh  phân tr  thành t p văn b n. Vì v y t p văn  ủ ệ ộ ườ ng h p riêng c a t p nh  phân.   b n là m t tr

ạ ệ

8.1. Khái ni m và phân lo i t p

ủ ệ

ứ  T  ch c c a t p

Tên t pệ

OS

ỏ ị Con tr  v  trí đang  ệ ủ ệ làm vi c c a t p

ầ ử ệ Ph n t  kí hi u  ệ ế k t thúc t p

. . . . .

E O F

ầ ử ữ ệ Ph n t  d  li u  ầ đ u tiên

ầ ử ữ ệ Ph n t  d  li u  cu i cùng

6

ạ ệ

8.1. Khái ni m và phân lo i t p

ỏ ệ

 Con tr  t p: ầ ử ủ  Các ph n t ể ờ

c a m t t p t o thành m t dãy và t

ậ ộ ượ ạ i  ộ c vào m t

c a t p mà thôi.

ể  Con tr  t p (File positon locator) là bi n đ m đ

ệ ấ ị

ộ ệ ạ ị ế ầ ử ủ ệ  c a t p, đánh d u v  trí  ể i th i đi m xác đ nh.

ầ ệ

7

ỏ ệ ỗ ẽ ự ộ ị ượ ặ ố ộ ệ ạ ộ ể ỉ m t th i đi m ta ch  có th  truy c p đ ầ ử ủ ệ ph n t ỏ ệ ậ truy c p vào m t ph n t ờ ậ truy c p vào t p t ẽ ở ệ ỏ  Khi m  t p con tr  t p s  luôn tr  vào v  trí đ u  ủ ệ ọ tiên c a t p. Sau m i thao tác đ c ghi trên t p,  ố ị ỏ ệ ể con tr  t p s  t  đ ng d ch chuy n v  phía cu i  ẽ ể ả ệ t p. Kho ng cách d ch chuy n (tính theo byte) s   ệ ọ ừ ệ ằ  t p ho c ghi lên t p. c đ c t b ng s  byte đã đ

ạ ệ

8.1. Khái ni m và phân lo i t p

ớ ệ ủ

 Quy trình thao tác v i t p: Các thao tác v i t p ph i tuân th  theo trình t

ở ệ

 Khai báo t pệ ể  M  t p đ  làm vi c ậ ệ  Truy nh p t p  Đóng t pệ

8

ớ ệ ả ự sau:

Ệ Ữ Ệ

Bài 8. T P D  LI U

ạ ệ

ớ ệ

 8.1. Khái ni m và phân lo i t p  8.2. Các thao tác v i t p

ậ ệ ậ ệ

 8.2.1. Khai báo  8.2.2 M  t pở ệ  8.2.3. Truy nh p t p văn b n  8.2.4. Truy nh p t p nh  phân  8.2.5. Đóng t pệ

9

Ệ Ữ Ệ

Bài 8. T P D  LI U

ạ ệ

ớ ệ

 8.1. Khái ni m và phân lo i t p  8.2. Các thao tác v i t p

ậ ệ ậ ệ

 8.2.1. Khai báo  8.2.2 M  t pở ệ  8.2.3. Truy nh p t p văn b n  8.2.4. Truy nh p t p nh  phân  8.2.5. Đóng t pệ

10

8.2.1. Khai báo t pệ

ậ ệ  Trong C truy nh p t p ph i thông qua

ỏ ệ

ỏ ệ file pointer)

ượ

ư

ỏ ệ

ộ con tr  t p. M t con tr  t p ( c khai báo nh  sau: đ FILE *tên_con_tr _t p;

 Ví dụ

FILE *f1, *f2;

11

Ệ Ữ Ệ

Bài 8. T P D  LI U

ạ ệ

ớ ệ

 8.1. Khái ni m và phân lo i t p  8.2. Các thao tác v i t p

ậ ệ ậ ệ

 8.2.1. Khai báo  8.2.2 M  t pở ệ  8.2.3. Truy nh p t p văn b n  8.2.4. Truy nh p t p nh  phân  8.2.5. Đóng t pệ

12

8.2.2 M  t pở ệ

ế ộ ở ệ

 Cú pháp: tên_con_tr _t p=fopen(tên_t p,ch _đ _m _t p);

ỏ ệ ệ ệ ế ệ ẫ ườ ng d n đ n t p.

 Tên_t p là đ  Ch  đ  m  t p:

ế ộ ở ệ

ử ụ

Kí hi uệ

M c đích s  d ng t p

ở ệ

ế ệ

ồ ạ

i,  hàm

“r”

ể ọ ẽ ả ạ ạ

M   t p  đã  có  đ   đ c,  không  đ i tr ng thái l

fopen() s  tr  l

ượ c  ghi.  N u  t p  không  t n  t ỗ i.

ế ệ

ớ ể

ở ệ

ồ ạ ộ

ẽ ị

ế

M  t p m i đ  ghi. N u t p đã t n t

i n i dung c a nó s  b  xóa h t.

“w”

ấ ữ ệ ủ

Kí hi uệ

B n ch t d  li u c a  t pệ

ư ồ ạ

ế ệ

ữ ệ

ố ệ

M  t p đ  ghi thêm d  li u vào cu i t p. N u t p ch a t n t

ẽ i, nó s

“a”

ở ệ đ

ể ớ ượ ạ c t o m i

ị T p nh  phân

“b”

ể ừ ọ ừ

ư ồ ạ

ế ệ

ở ệ

M  t p đ  v a đ c v a ghi. N u t p ch a t n t

ẽ i thì s  báo l

i

“r+”

T p văn b n

“t”

ọ ừ

ế ệ

ể ừ

ở ệ

ồ ạ

M  t p đ  v a đ c v a ghi. N u t p đã t n t

ẽ ị ủ i, n i dung c a nó s  b

“w+”

xóa h t.ế

ớ ẽ ượ ạ

ữ ệ

ố ệ

ở ệ

M  t p đ  ghi thêm d  li u vào cu i t p. T p m i s  đ

“a+”

ế c t o n u nó  13

ư ồ ạ

ể ch a t n t

i.

ụ ở ệ

Ví d  m  t p

FILE *f1, *f2, *f3;

ể ọ

 Đ  m  t p

ể ở ệ c:\abc.txt  đ  đ c ta dùng l nh f1 = fopen("c:\\abc.txt", "rt"); ể ở ệ c:\ho_so.dat  đ  ghi ta dùng l nh

 Đ  m  t p

ể ừ

ể ở ệ c:\abc.txt đ  v a đ c và ghi ta

f2 = fopen("c:\\ho_so.dat", "wb");  Đ  m  t p  dùng l nhệ f3 = fopen("c:\\abc.txt", "r+t");

14

ở ệ

ư

L u ý khi m  t p

ế

ở ệ

 N u vi c m  t p không thành công, và  ể ẽ ả ề hàm fopen() s  tr  v  giá tr  NULL đ   ở ệ ằ báo r ng vi c m  t p không thành  công.

ế

ả ả ề  Khi đó ta nên ki m tra k t qu  tr  v   ế ợ ử ữ này đ  có nh ng x  lí thích h p, n u  ự ỗ ươ không ch i và t ng trình s  báo l đ ng thoát ra ngoài.

15

ở ệ

ư

L u ý khi m  t p

ở ệ

 Đ  b t l

i phát sinh khi m  t p ta có

ể ắ ỗ ể ử ụ

th  s  d ng m u sau:

ở ệ

ỗ i

ng h p m  t p có l

ế ộ

ở ệ

ườ // Tr FILE *f; f= fopen(tên_t p, ch _đ _m _t p)) ; if(f== NULL) {

ườ

ở ệ

ng h p m  t p không thành công>

ườ

ở ệ

ng h p m  t p thành công

} else // Tr {

ở ệ

}

16

Ệ Ữ Ệ

Bài 8. T P D  LI U

ạ ệ

ớ ệ

 8.1. Khái ni m và phân lo i t p  8.2. Các thao tác v i t p

ậ ệ ậ ệ

 8.2.1. Khai báo  8.2.2 M  t pở ệ  8.2.3. Truy nh p t p văn b n  8.2.4. Truy nh p t p nh  phân  8.2.5. Đóng t pệ

17

ậ ệ

8.2.3. Truy nh p t p văn b n

ữ ệ ừ ệ

t p:

ọ  Đ c d  li u t  fscanf()  fgets()  getc()

18

Hàm fscanf()  Cú pháp khai báo:

ỏ ệ

int fscanf(FILE* con_tr _t p, xâu_đ nh_d ng, [danh_sách_đ a_ch ]);

 Đ c t

ọ ừ ệ ả ươ ỏ ệ ứ ớ t p văn b n t ng  ng v i con_tr _t p

ữ ệ

 Đ nh d ng DL đ c theo khuôn d ng trong

ạ ị

ư ị ượ dãy các d  li u. ọ ạ ị xâu_đ nh_d ng.  L u các giá tr  đ c đ ỉ c vào danh_sách_đ a_ch .

ư

ộ Ví d  file có n i dung nh  sau:

117 a 24 x 338 h

19

ị ọ struct  {        int n; char c; }a[3]; for(int i=0;i<3;i++)            fscanf(fptr,”%d %c”,&a[i].n,&a[i].c);

Hàm fgets()

 Cú pháp khai báo:

char* fgets(char* xâu_kí_t

ỏ ệ   , int n, FILE* con_tr _t p);

 Đ c t

ọ ừ ệ ả ươ ỏ ệ ứ ớ t p văn b n t ng  ng v i con_tr _t p

ữ ệ

 Đ c d ng khi đ c đ  (n­1) ký t

ủ ự ặ ự dãy các d  li u. ọ ặ  ho c g p ký t

ừ xu ng dòng.

ọ ố ư ự c + “\n\0” vào xâu_ký_t .

ượ ọ

 L u các giá tr  đ c đ  Giá tr  tr  v : ề v  xâu kí t ỏ ề v  con tr  NULL.

20

ị ọ ế ự ỏ ở ự ế ỗ ả ị ả ề n u đ c thành công hàm fgets() tr   ẽ ả i nó s  tr tr  b i xâu_kí_t , n u có l

Hàm getc()

 Cú pháp khai báo:

ỏ ệ

int getc(FILE* con tr  t p);

 Hàm getc() đ c t

ọ ừ ệ

ữ ệ ể ạ

ị ả ề ủ ị ố ượ

ộ ự ứ ộ  (t c là m t byte   t p m t kí t ố ự ổ d  li u), sau đó chuy n đ i kí t  đó sang d ng s   ồ ấ nguyên int (b ng cách thêm byte cao 0x00) r i l y  giá tr  s  nguyên thu đ c làm giá tr  tr  v  c a  hàm.

 Giá tr  tr  v : n u thành công hàm getc() tr  v  kí

ị ả ề ế

ượ ể ạ c sau khi đã chuy n sang d ng

21

ả ề ự ọ  đ c đ t ế N u không thành công hàm tr  v  giá tr ả ề int.  ị EOF.

ậ ệ

8.2.3. Truy nh p t p văn b n

ữ ệ  Ghi d  li u lên t p:

 fprintf()  fputs()  putc()

22

Hàm fprintf()

 Cú pháp khai báo:

ỏ ệ

ị int fprintf(FILE* con_tr _t p, xâu_đ nh_d ng, [danh_sách_tham_s ]);

ươ

ư ứ  Hàm fprintf() có ch c năng hoàn toàn t ỉ ỗ

ữ ệ ữ ệ ng là màn hình) còn fprintf() ghi d  li u

ị ỉ ượ ố c ch  đ nh trong tham s

ự ng t   ộ nh  hàm printf(), ch  có m t ch  khác là hàm  ẩ ế ị t b  ra chu n (stdin,  printf() ghi d  li u lên thi thông th lên m t t p đ con_tr _t p.

ế ệ

ệ ế ườ ộ ệ ỏ ệ ả ả ề ế ả ề ộ ệ

23

ự ả ề ự  K t qu  tr  v : n u th c hi n thành công, hàm  ữ ị fprintf() tr  v  m t giá tr  nguyên là s  bytes d   ệ li u đã ghi lên t p. N u th c hi n không thành  công thì hàm fprintf() tr  v  giá tr ị EOF.

Hàm fputs()

 Cú pháp khai báo:

ỏ ệ

int fputs(char* xâu_kí_t

, FILE* con_tr _t p);

 Hàm fputs() s  ghi n i dung c a xâu_kí_t

ẽ ự ủ

ứ ộ ỏ ệ

ự ộ ệ  lên t p  ớ ng  ng v i con_tr _t p, tuy nhiên nó khác v i  ự    đ ng ghi thêm kí t ớ ở  ch  nó không t

ố ươ t hàm puts()  xu ng dòng lên t p.

ệ ị ả ề n u th c hi n thành công hàm

ự ố ượ

 Giá tr  tr  v : ả ề ế

cu i cùng mà nó ghi đ ả ề

24

ỗ ệ ế ự fputs() tr  v  kí t c lên  ị ệ t p, còn n u không thành công nó tr  v  giá tr   EOF.

Hàm putc()

 Cú pháp khai báo:

ỏ ệ   int putc(int ch, FILE* con_tr _t p);

 Hàm putc()ghi n i dung c a kí t

ch a trong bi n  ủ ứ ế ế ự ộ ự ượ  đ c ch a trong byte th p c a bi n

ứ ấ ỏ ệ ớ ứ int ch (kí t ch) lên t p t ng  ng v i con_tr _t p.

ẽ ả  Giá tr  tr  v : n u thành công hàm putc() s  tr   ả  trong b ng  ế ố ứ ự ệ ủ đã ghi lên t p. N u không

25

ệ ươ ị ả ề ế ể int) là s  th  t ề ố v  s  nguyên (ki u  ự mã ASCII c a kí t ả ề thành công nó tr  v  giá tr ị EOF.

ộ ố

M t s  thao tác khác

 Hàm feof()

ỏ ệ

int feof(FILE* con_tr _t p);

ệ ế ị  Hàm feof() dùng đ  ki m tra xem đã duy t đ n v

ể ể ư trí cu i t p hay ch a.

ọ c đ c

ố ệ ể ở ầ ố ữ ệ ấ ự ượ ầ ử EOF hay

ế

 Hàm ki m tra xem trong kh i d  li u đ ầ ệ  l n th c hi n g n nh t có ph n t vào  ị ả ề ộ không, n u có thì hàm feof() tr  v  m t giá tr   ị ư khác 0, còn n u ch a thì tr  v  giá tr  0.

26

ả ề ế

fseek(f,10,SEEK_SET);

ộ ố

M t s  thao tác khác

 Hàm fseek()

ỏ ệ

ả ầ

n có th  âmể

ầ int fseek(FILE* con_tr _t p, long int n, int v _trí_ban_đ u);  ỏ ệ ừ ể ị  Hàm fseek() dùng đ  d ch chuy n con tr  t p t   ộ ộ ị v _trí_ban_đ u đi m t kho ng cách có đ  dài n  bytes.

 Giá tr  tr  v : hàm fseek() s  tr  v  giá tr  0 n u

ẽ ả ề ị ả ề ế

ư ệ ể ị ị ả ề

Tên h ngằ

Ý nghĩa

ầ ệ

ầ V  trí ban đ u là đ u t p

Giá  trị 0

SEEK_SET

ờ ủ

1

SEEK_CUR

ị ị

ầ ỏ V  trí ban đ u là v  trí hi n th i c a con tr   ệ ủ ệ v  trí làm vi c c a t p

27

ố ệ

2

ầ V  trí ban đ u là cu i t p

SEEK_END

ệ ế ể ị ị nh  vi c d ch chuy n thành công, và tr  v  giá tr   khác 0 n u vi c d ch chuy n không thành công.

ộ ố

M t s  thao tác khác

 Hàm rewind()

ẽ ư

ỏ ệ

ươ

ề ầ  Hàm rewind() s  đ a con tr  t p v  đ u  ế ỏ ệ ộ ệ t p. V i file_ptr là m t bi n con tr  t p,  ớ ươ ng v i  ng đ hàm rewind(file_ptr) t fseek(file_ptr,0,SEEK_SET);

ị ả ề

 Hàm rewind() không có giá tr  tr  v .

28

ỏ ệ   void rewind(FILE* con_tr _t p);

Ệ Ữ Ệ

Bài 8. T P D  LI U

ạ ệ

ớ ệ

 8.1. Khái ni m và phân lo i t p  8.2. Các thao tác v i t p

ậ ệ ậ ệ

 8.2.1. Khai báo  8.2.2 M  t pở ệ  8.2.3. Truy nh p t p văn b n  8.2.4. Truy nh p t p nh  phân  8.2.5. Đóng t pệ

29

int a[3]; fread(a,2,3,f); double d; fread(&d,4,1,f);

ậ ệ

8.2.4. Truy nh p t p nh  phân

ữ ệ  Đ c d  li u trên t p

ỏ ệ

ế

int fread(void *đ a_ch _bi n, int s _byte, int s _m c, FILE* con_tr _t p);

 Hàm fread() đ c t ố

ộ ọ ừ ệ ố ữ ệ

ụ (cid:0) c s _m c

ị ớ

ế

 K t qu  tr  v : n u vi c đ c d  li u t

t p m t kh i d  li u kích  ố ố  s _byte bytes, sau đó ghi kh i  th ỉ d  li u đó lên vùng nh  có đ a ch  là  ỉ đ a_ch _bi n. ả ả ề ế ọ t p th c

ướ ữ ệ ị ế ệ ữ ệ ừ ệ ả ề ộ

ả ố ọ c

ố ụ ự ượ  t p. N u th c hi n không thành công thì hàm

30

ệ ị ự ệ ị hi n thành công, hàm fread() tr  v  m t giá tr   nguyên là s  m c (không ph i s  bytes) đ c đ ừ ệ ế t ả ề fread() tr  v  giá tr  0.

ậ ệ

8.2.4. Truy nh p t p nh  phân

ữ ệ  Ghi d  li u trên t p

ỏ ệ

ế

int fwrite(void *đ a_ch _bi n, int s _byte, int s _m c, FILE* );

ố ữ ệ b  nh  m t kh i d  li u có

ị ớ ộ ế

(cid:0) ẽ ọ ừ ộ  Hàm fwrite() s  đ c t ị ỉ ỉ ắ ầ ụ ố ướ c  ố  s _m c bytes, sau đó nó ghi kh i

đ a ch  b t đ u là đ a_ch _bi n và có kích th là s _byte  ệ d  li u này lên t p. ả ả ề ế ự ệ  K t qu  tr  v : n u vi c ghi d  li u lên t p th c

ố ữ ệ ế ệ ệ ữ ệ ẽ ả ề ộ

ả ố

ố ụ ự ệ ệ

31

ị ị hi n thành công, hàm fwrite() s  tr  v  m t giá tr   nguyên là s  m c (không ph i s  bytes) đã ghi  ế lên t p. N u th c hi n không thành công thì hàm  ả ề fwrite() tr  v  giá tr  0.

ậ ệ

8.2.4. Truy nh p t p nh  phân

ỏ ệ

ươ

ư ệ

ng t

ị  T

ể  D ch chuy n con tr  t p ả ự  nh  t p văn b n, ta có th  dùng

ể ị ị

ỏ ệ

ị ớ ệ

ả ư

ư

ể các hàm fseek() và rewind() đ  d ch  chuy n con tr  t p trên t p nh  phân. Hàm  ớ ệ fseek() khi dùng v i t p nh  phân thì không  ph i l u ý nh  khi dùng v i t p văn b n.

Nh n xét: Các hàm trong các c p hàm fread() – fwrite(),  fscanf() – fprintf(), fputs() – fgets(), và getc() – putc()  có ch c năng đ i ng u nhau.

32

Ệ Ữ Ệ

Bài 8. T P D  LI U

ạ ệ

ớ ệ

 8.1. Khái ni m và phân lo i t p  8.2. Các thao tác v i t p

ậ ệ ậ ệ

 8.2.1. Khai báo  8.2.2 M  t pở ệ  8.2.3. Truy nh p t p văn b n  8.2.4. Truy nh p t p nh  phân  8.2.5. Đóng t pệ

33

8.2.5. Đóng t pệ

 Cú pháp:

ỏ ệ

int fclose(FILE* );

 Hàm fclose() tr  l

ả ạ ị ế

ị i giá tr  0 n u đóng thành công,  ế ệ

34

ả ề tr  v  giá tr  EOF n u không đóng t p thành  công.

Bài t pậ

Bài 1: Vi

ế ươ ng trình copy file: t ch ừ ậ  bàn phím 2 xâu kí t  Nh p vào t ồ ủ c a file ngu n và file đích.

ự ườ ẫ là đ ng d n

 Copy n i dung c a file ngu n sang file đích.

ố ộ

ươ

ế

ng trình ghép n i n i dung 2

t ch

ủ ồ ộ

Bài 2: Vi file ậ  Nh p vào t

ự ườ ẫ là đ ng d n

ừ  bàn phím 2 xâu kí t ồ ủ c a file ngu n và file đích

 Ghép n i dung c a file ngu n vào cu i file đích. 35

ủ ộ ồ ố

Bài t pậ

ư

Bài 3: M t t p văn b n tên là "thisinh.txt" l u DL v  các thí sinh và

ả ư

có t

ư

ố ượ ỗ

ế

ọ ậ

ề ộ ự  đánh cho ph n th p phân, m t kí t

ộ ệ ổ  ch c nh  sau: Dòng đ u tên l u s  l ng thí sinh. ồ ư Các dòng ti p theo m i dòng l u thông tin v  m t thí sinh g m  ự có: s  báo danh (10 kí t ), h  và tên (30 kí t ), đi m thi (4 kí t   ớ v i 1 kí t  cho d u "." dùng  ể đ  ngăn cách và 2 kí t

ự ầ ự  cho ph n nguyên).

ế

Hãy vi

ng trình ữ ệ ừ ệ

ị  t p "thisinh.txt" và hi n th  ra màn hình danh sách

ươ t ch ọ Đ c d  li u t các thí sinh theo quy cách:

So thu tu So bao danh Ho ten Điem thi

ế

ế

ố ứ ự ị ế

ố ế

ế

ế

ư ủ ệ

ư

ọ Trong đó s  th  t  chi m 3 v  trí, s  báo danh chi m 10 v  trí, h   và tên chi m 30 v  trí, đi m thi chi m 5 v  trí v i 2 v  trí dành cho  ầ ậ ph n th p phân. ả ể ắ S p x p các thí sinh theo k t qu  đi m thi tăng d n và l u vào  ố ệ t p "thisinh2.txt" v i quy cách gi ng nh  quy cách c a t p  "thisinh.txt".

36