You are on page 1of 23

Nội dung

 Ý nghĩa của tệp


 Phân loại tệp
 Thao tác với tệp
 Kiểu FILE
 Thao tác với tệp văn bản
 Thao tác với tệp nhị phân
 Bài tập
Ý nghĩa của tệp
 Tệp thường dùng để lưu dữ liệu lâu dài.
 Dùng để trao đổi dữ liệu giữa các chương trình.
 Tệp thường dùng để lưu dữ liệu kết quả của chương trình.
Phân loại tệp
 Có 2 loại tệp:
 Tệp văn bản: là tệp lưu dữ liệu dưới dạng các ký tự và
không có định dạng.
 Tệp nhị phân: là tệp lưu dữ liệu được mã hóa theo từng mục
đích khác nhau.
 Tệp văn bản có thể đọc bằng bất kỳ trình soạn thảo văn bản
nào. Dùng cho việc trao đổi dữ liệu.
 Tệp nhị phân muốn đọc phải biết định dạng và có phần mềm
phù hợp.
Thao tác với tệp
 Các thao tác cơ bản:
 Mở tệp
 Đọc dữ liệu từ tệp
 Ghi dữ liệu ra tệp
 Đóng tệp
 Thao tác với tệp là tuần tự.
 Xóa, sửa dữ liệu phải chuyển thành thao tác đọc, ghi.
Kiểu FILE
 Để thao tác với tệp, trong C định nghĩa kiểu FILE
 Mỗi tệp dùng 1 biến con trỏ FILE để quản lý và thao tác.
Thao tác với FILE
 Mở tệp: dùng hàm fopen(tenTep, kieu)
 kieu gồm: r (đọc), w (ghi), a (thêm), r+, w+, a+. Thêm b
cho tệp nhị phân.
 Kết quả trả về con trỏ kiểu FILE. Nếu có lỗi trả về NULL.
 Ví dụ:
FILE *f;
f = fopen("dulieu.txt", "w");
 Đóng tệp: khi không sử dụng tệp thì đóng tệp.
 Hàm đóng tệp: fclose(biến tệp);
 Ví dụ: fclose(f);
 Đọc tệp:
fscanf(bienTep, "định dạng", các địa chỉ);
 Ví dụ:
fscanf(f, "%d %f", &d, &x);
 Mỗi khi đọc tệp thì con trỏ tệp chuyển sang vị trí tiếp theo
trong tệp sau vị trí dữ liệu vừa đọc.
 Ghi tệp: fprintf(bienTep, "định dạng", các
biểu thức);
 Ví dụ: fprintf(f, "%d %f", a, x);
Ví dụ 1.
 Viết chương trình:
- Nhập vào tên, năm sinh, điểm trung bình của một
sinh viên.
- Lưu thông tin của sinh viên vào tệp sinhvien.txt
- Đọc tệp sinhvien.txt in lên màn hình thông tin đọc
được.
#include <stdio.h>
main()
{
char ten[10];
int namSinh;
float dtb;

gets(ten);
scanf("%d %f", &namSinh, &dtb);

FILE *f;
f = fopen("sinhvien.txt","w");
fprintf(f, "%s %d %f", ten, namSinh, dtb);
fclose(f);

f = fopen("sinhvien.txt","r");
fscanf(f, "%s %d %f", ten, &namSinh, &dtb);
fclose(f);

printf("%s %d %f", ten, namSinh, dtb);


}
 Viết dạng hàm
#include <stdio.h>
void ghiTep()
{
char ten[10];
int namSinh;
float dtb;
gets(ten);
scanf("%d %f", &namSinh, &dtb);
FILE *f;
f = fopen("sinhvien.txt","w");
fprintf(f, "%s %d %f", ten, namSinh, dtb);
fclose(f);
}
void docTep()
{
char ten[10];
int namSinh;
float dtb;
FILE *f;
f = fopen("sinhvien.txt","r");
fscanf(f, "%s %d %f", ten, &namSinh, &dtb);
fclose(f);
printf("%s %d %f", ten, namSinh, dtb);
}
main()
{
ghiTep();
docTep();
}
Ví dụ 2
 Viết chương trình:
Lưu 1 mảng số nguyên ra tệp songuyen.txt.
Đọc tệp songuyen.txt và tính tổng các số đọc được.
#include <stdio.h>
void ghiTep(int a[], int n)
{
FILE *f; int i;
f = fopen("songuyen.txt", "w");
for(i = 0; i < n; i++)
fprintf(f," %d", a[i]);
fclose(f);
}
void docTep()
{
FILE *f; int s,kq, tg;
f = fopen("songuyen.txt", "r");
s = 0;
do
{
kq = fscanf(f," %d", &tg);
if (kq!=EOF)
s = s + tg;
} while (kq!=EOF);
printf("%d", s);
fclose(f);
}
main()
{
int x[5] = {1, 5, 3, 7, 10};
ghiTep(x, 5);
docTep();
}
Luyện tập 1.
 Viết hàm ghi các số chẵn của mảng vào tệp
“sochan.txt”. Hàm đọc tệp “sochan.txt” và in các số đọc
được từ tệp và số số đã đọc.
Tệp nhị phân
 Tệp nhị phân ghi dữ liệu bất kỳ từ bộ nhớ vào tệp.
 Ghi tệp:
fwrite(địa chỉ, n, kích thước, tệp);
 Ghi dữ liệu từ địa chỉ ra tệp.
 n là số phần tử cần ghi.
 Kích thước là số byte của mỗi phần tử.
 Tệp là con trỏ FILE đến tệp đang được mở.
 Kết quả hàm trả về số phần tử ghi được vào tệp.
Ví dụ 3.
 Tạo tệp data.dat chứa năm sinh và điểm trung bình của một sinh
viên.
#include <stdio.h>
main()
{
FILE *f;
int namSinh = 2002;
float dtb = 7.5;
f = fopen("data.dat","wb");
fwrite(&namSinh, 1, sizeof(int), f);
fwrite(&dtb, 1, sizeof(float), f);
fclose(f);
}
 Đọc tệp nhị phân:
fread(địa chỉ, n, kích thước, tệp);
 Đọc dữ liệu từ tệp ra bộ nhớ trong.
 Địa chỉ là nơi bắt đầu chứa dữ liệu đọc từ tệp.
 n là số phần tử cần đọc.
 Kích thước: là số byte của một phần tử đọc từ tệp.
 Tệp là con trỏ FILE đến tệp đang mở cần đọc.
 Kết quả hàm trả về số phần tử đọc được.
Ví dụ 4.
 Đọc tệp data.dat đã lưu trong ví dụ 3.
#include <stdio.h>
main()
{
FILE *f;
int namSinh;
float dtb;
f = fopen("data.dat","rb");
fread(&namSinh, 1, sizeof(int), f);
fread(&dtb, 1, sizeof(float), f);
fclose(f);
printf("%d %f", namSinh, dtb);
}
 Chuyển vị trí trong tệp:
fseek(tệp, vị trí, mốc);
 Chuyển con trỏ tệp đến một vị trí trong tệp.
 Tệp là con trỏ tệp đang mở.
 Vị trí là số nguyên xác định vị trí cần chuyển đến.
 Mốc là số nguyên xác định mốc để di chuyển con trỏ
tệp:
0 (SEEK_SET) Vị trí đầu tệp
1 (SEEK_CUR) Vị trí hiện tại của con trỏ tệp
2 (SEEK_END) Vị trí cuối tệp
 Ví dụ: sửa đtb trong tệp data.dat tạo ra trong Ví dụ 3.
#include <stdio.h>
main()
{
FILE *f;
float dtb = 8.5;
f = fopen("data.dat","r+b");
fseek(f, sizeof(int), 0);
fwrite(&dtb, 1, sizeof(float), f);
fclose(f);
}
Tổng kết
 Tệp là cách lưu trữ dữ liệu lâu dài và dùng cho việc
trao đổi dữ liệu giữa các chương trình.
 Có 2 loại tệp:
 Tệp văn bản
 Tệp nhị phân
Bài tập
1. Tạo tệp chứa các số ở vị trí chẵn lưu vào tệp
sovtchan.txt. Đọc tệp và tính trung bình cộng các số
trong tệp.
2. Tạo tệp soNT.txt chứa n số nguyên tố đầu tiên, mỗi
dòng 10 số. Đọc tệp và cho biết số nguyên tố thứ k?
3. Nhập vào 2 sinh viên (họ tên, năm sinh, đtb) rồi lưu
lần lượt 2 sinh viên vào tệp sinhvien.dat. Đọc tệp và
in các thông tin sinh viên đọc được từ tệp lên màn
hình.
4. Nhập 1 họ tên sinh viên. Tìm sinh viên này trong tệp
sinhvien.dat xem có không?

You might also like