Buổi 7: Kiểu tập tin và nâng cao

Giảng viên: TS. Lê Hoàng Sơn

lehoangson@hus.edu.vn

1

Lập trình tính toán khoa học kỹ thuật

Nội dung chính

Kiểu Tập Tin

1

Nâng Cao Về C

2

Bài tập

3

2/24 Lê Hoàng Sơn

1. Kiểu tập tin (File)

 File là loại dữ liệu có thể ghi lên đĩa để dùng nhiều lần.

 Trong C chỉ có một loại File, nhưng cấu trúc của mỗi File

có thể khác nhau.

 Cấu trúc này được hình thành khi ta ghi dữ liệu lên File, nó phụ thuộc vào hàm mà ta dùng để ghi dữ liệu lên đĩa.

 Có hai kiểu xuất/ nhập dữ liệu vào File:

 Nhị phân  Văn bản

3/24 Lê Hoàng Sơn

Kiểu xuất/nhập tập tin

 Nhị phân:

 Dữ liệu trong file ở dạng các số nhị phân  Dữ liệu ghi lên tập tin không bị thay đổi và khi đóng tập tin thì mã

kết thúc tập tin sẽ được ghi lên đĩa là -1

 Văn bản:

 Dữ liệu ở dạng text 

Khi xử lý ký tự xuống dòng và khi đóng tập tin thì mã kết thúc tập tin sẽ được ghi lên đĩa là 26 Khi ghi một ký tự chuyển dòng lên đĩa (mã 10) sẽ ghi thành 2 ký tự mã 13 và mã 10. Khi đọc, nếu gặp hai ký tự liên tiếp là mã 10 và mã 13, sẽ gom lại thành một ký tự là mã 10.

4/24 Lê Hoàng Sơn

Một số hàm xuất/ nhập chuẩn  Mở file: Nếu thành công trả về kết quả là con trỏ FILE tương ứng

FILE *fopen(const char *tên_tập_tin,const char *kiểu_truy_cập);

với file vừa mở, ngược lại trả về giá trị NULL. 

 Đóng file: Ðóng tập tin được chỉ đến bởi con trỏ f. Nếu thành công

int fclose(FILE *f)

thì giá trị của hàm = 0 ngược lại có giá trị EOF. Sau khi đóng con trỏ f sẽ không còn trỏ đến file trước đó nữa 

 Làm sạch vùng đệm của tập tin được chỉ đến bởi con trỏ f. Nếu

int fflush(FILE *f)

thành công cho giá trị 0, ngược lại cho giá trị EOF 

 Xóa một tập tin trên đĩa: Nếu thành công giá trị của hàm bằng 0 ,

ngược lại cho giá trị EOF 

int unlink(const char *tên_tập_tin)

5/24 Lê Hoàng Sơn

Một số hàm xuất/ nhập chuẩn (P2)

 Ðổi tên một tập tin trên đĩa: Nếu thành công giá trị của hàm

int rename(const char *tên_cũ,const char *tên_mới)

bằng 0 , ngược lại cho giá trị EOF 

 Kiểm tra kết thúc tập tin: Cho giá trị khác không nếu ở cuối

tập tin, ngược lại =0  int feof(FILE *f)

 Ghi dữ liệu theo khuôn dạng: dữ liệu sẽ được ghi lên file

int fprintf(FILE *f , const char *đặc tả,....)

 Ðọc dữ liệu theo khuôn dạng: dữ liệu sẽ được đọc từ File f

rồi đưa vào các đối số tương ứng 

fscanf(FILE *f , const char *đặc tả,....)

6/24 Lê Hoàng Sơn

Một số hàm xuất/ nhập chuẩn (P3)

int fputs(const char *s, FILE *f)

 Ghi một chuỗi: Ghi một chuỗi được chỉ tới bởi con trỏ s vào file f. Kết quả = ký tự cuối được ghi nếu thành công, ngược lại =EOF 

char *fgets(const char *s, int n, FILE *f)

 Ðọc một chuỗi: Ðọc một chuỗi từ File f và đưa vào vùng nhớ do s trỏ đến. Việc đọc kết thúc khi đã đọc được n-1 ký tự , hoặc gặp ký tự xuống dòng , hoặc gặp ký tự kết thúc File. Nếu việc đọc có lỗi kết quả của hàm =NULL 

 Ðưa con trỏ về đầu file: void rewind ( FILE *f);

7/24 Lê Hoàng Sơn

Nhập danh sách sinh viên từ file và in ra file khác sinh viên có điểm lớn nhất

Cấu trúc sinh viên

Con trỏ đến file input và output

Mở input để đọc và output để ghi

#include #include #include struct sinhvien { int masv; char hoten[30]; float diem; }; FILE *fi, *fo; sinhvien *sv; int n; int mofile(char *filein, char *fileout) { fi = fopen (filein,"r"); rewind(fi); fo = fopen (fileout,"w"); rewind(fo); if ( (fi == NULL) || (fo == NULL) ) return 0; return 1; }

8/24 Lê Hoàng Sơn

Nhập danh sách sinh viên từ file và in ra file khác sinh viên có điểm lớn nhất (P2)

Đọc số sinh viên và ghi vào n

Nhập từng dòng dữ liệu

int dongfile() { fclose(fi); fflush(fi); fclose(fo); fflush(fo); } void docdulieu() { int i = 0; fscanf (fi, "%d", &n); sv =(sinhvien *) calloc(n,sizeof(sinhvien)); while (!feof(fi)) { fscanf (fi, "%d", &sv[i].masv); fgets(sv[i].hoten,30,fi); fscanf (fi, "%f", &sv[i].diem); i++; } }

9/24 Lê Hoàng Sơn

Nhập danh sách sinh viên từ file và in ra file khác sinh viên có điểm lớn nhất (P3)

In danh sách sinh viên ra màn hình

Tìm sinh viên có điểm lớn nhất

Lưu thứ tự sinh viên vào vitri

void indanhsach() { int i; puts("Danh sach sinh vien:"); puts("MaSV\tHo va ten\tDiem"); for (i=0; i= max) { max = sv[i].diem; vitri = i; } return vitri; }

10/24 Lê Hoàng Sơn

Nhập danh sách sinh viên từ file và in ra file khác sinh viên có điểm lớn nhất (P4)

In sinh viên có điểm lớn nhất vào file output

Chương trình chính

void inraoutput(int i) { fprintf(fo,"\n%d\t\t%s\t\t%5.3f",sv[i].masv,sv[i].hoten,sv[i].diem); } int main() { mofile("danhsach.inp", "danhsach.out"); docdulieu(); indanhsach(); inraoutput( timsinhvien() ); dongfile(); printf("\n\nSinh vien co diem lon nhat trong file danhsach.out !"); getch(); }

11/24 Lê Hoàng Sơn

Kết quả

12/24 Lê Hoàng Sơn

Nội dung chính

Kiểu Tập Tin

1

Nâng Cao Về C

2

Bài tập

3

13/24 Lê Hoàng Sơn

Đo thời gian chạy của chương trình

Biến thời gian

Đo thời gian chạy

# include # include # include int main() { float max, min, tam; clock_t t1,t2; t1=clock(); printf("\nNhap vao so max, min: "); scanf("%f%f", &max, &min); if (max < min) { tam = max; max = min; min = tam; } printf("\nMax = %5.3f Min = %5.3f", max, min); t2=clock(); float diff = ((float)t2 - (float)t1) / CLOCKS_PER_SEC; printf("\nThoi gian chay chuong trinh la: %5.3f giay", diff); getch(); return 0;}

14/24 Lê Hoàng Sơn

Kết quả

15/24 Lê Hoàng Sơn

Kiểm tra đoạn nhập vào là số hay xâu?

Kiểm tra có phải là số

char mang[14][15] = {"00100" ,"-00200","+030","-040.30", "-000.35"," 50","50 ","char","200.003-",".-","-", ".","+1.234E-05","-6.789E+10"}; for(int i=0; i<14; i++){

Kiểm tra các phần tử

printf("la so!\n");

}

#include #include #include #include #include int isNumber(const char str[]){ char *ok; strtod(str,&ok); return !isspace(*str) && strlen(ok)==0; } int main(){ printf("%s:\t\t\t", mang[i]); if(isNumber(mang[i])) else printf("khong phai la so!\n"); getch(); return 0; }

16/24 Lê Hoàng Sơn

Kết quả

17/24 Lê Hoàng Sơn

Chuyển xâu thành số

Chuyển xâu thành số

#include #include #include int main () { int i; char xau [256]; printf ("\nNhap vao mot so: "); fgets ( xau, 256, stdin ); i = atoi (xau); printf ("\nXau nhap vao la: %s\nSo la: %d",xau,i); getch(); return 0; }

18/24 Lê Hoàng Sơn

Kết quả

19/24 Lê Hoàng Sơn

Tóm tắt bài học

Kiểu tập tin

 Kiểu xuất/nhập tập tin  Một số hàm xuất/ nhập chuẩn

Một số ví dụ nâng cao

 Đo thời gian chạy chương trình  Kiểm tra đoạn nhập vào là số hay xâu?  Chuyển xâu thành số

20/24 Lê Hoàng Sơn

Câu hỏi thảo luận

21/24 Lê Hoàng Sơn

Nội dung chính

Kiểu Tập Tin

1

Nâng Cao Về C

2

Bài tập

3

22/24 Lê Hoàng Sơn

Bài tập

1. Đối với danh sách sinh viên trong ví dụ 1, hãy in ra file output danh sách sinh viên mới sắp xếp theo thứ tự alphabet của họ tên 2. Cho bai2.inp như sau:

- Dòng đầu là chỉ số hàng và cột của ma trận - Các dòng sau là phần tử ma trận Ghi vào file bai2.out: a) Dòng đầu: Số phần tử dương b) Dòng thứ hai: Số phần tử âm c) Dòng thứ ba: Số phần tử bằng 0

23/24 Lê Hoàng Sơn

Lê Hoàng Sơn

C l i c k t o e d i t c o m p a n y s l o g a n .

Lập trình tính toán khoa học kỹ thuật