1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Kỹ thuật lập trình Chương 6 Trần Minh Thái

35 344 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 35
Dung lượng 121,75 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng Kỹ thuật lập trình Chương 6 Thao tác trên tập tin cung cấp cho người học các kiến thức Khái niệm, khai báo, các thao tác trên tập tin. Cuối| Bài giảng có phần bài tập giúp người học có thể ôn tập và củng cố kiến thức đã học.

Trang 4

Khái niệm

• File cho phép lưu trữ dữ liệu ở bộ nhớ ngoài (đĩa)

• File có thể lưu dữ liệu kích thước lớn với số lượng

các phần tử không hạn chế (chỉ bị hạn chế bởi dung

lượng của bộ nhớ ngoài)

Trang 5

Khái niệm

• Biến File: là một biến thuộc kiểu dữ liệu tập tin dùng

để đại diện cho một tập tin

• Con trỏ tập tin: Xác định vị trí trong tập tin khi thao

tác đọc /ghi

• Phân loại File:

• File text

• File nhị phân

Trang 6

File text

• Dùng để ghi các ký tự lên đĩa dưới dạng mã Ascii

• Dữ liệu của tập tin được lưu trữ thành các dòng, mỗi dòng được kết thúc bằng ký tự xuống dòng (new line), ký hiệu

‘\n’

• Mỗi tập tin được kết thúc bởi ký tự EOF (End Of File) có

mã Ascii là 26 (xác định bởi tổ hợp phím Ctrl + Z)

Trang 7

File nhị phân

• Một dãy các bytes liên tục

• Nội dung dữ liệu được mã hóa

Trang 8

CÁC THAO TÁC TRÊN FILE

Trang 9

Các thao tác khi thao tác trên File

1 Khai báo con trỏ file

2 Mở file

3 Thao tác đọc/ ghi trên file

4 Đóng file

Trang 10

Khai báo con trỏ file

• Cú pháp:

FILE <Danh sách các biến con trỏ>;

• Các biến trong danh sách phải là các con trỏ và được phân cách bởi dấu phẩy(,)

• Ví dụ: FILE *f1, *f2;

Trang 11

Mở file

• Cú pháp:

FILE *fopen(char *path, const char *mode)

• Trong đó:

• path: chuỗi chỉ đường dẫn đến tập tin trên đĩa

• mode: chuỗi xác định cách thức mà tập tin sẽ mở

• Hàm fopen trả về một con trỏ tập tin Nếu có lỗi xuất hiện trong khi mở tập tin thì trả về con trỏ NULL

Trang 12

Các thông tin Mode

r Mở tập tin văn bản để đọc

w Tạo ra tập tin văn bản mới để ghi

a Nối vào tập tin văn bản

rb Mở tập tin nhị phân để đọc

wb Tạo ra tập tin nhị phân để ghi

ab Nối vào tập tin nhị phân

r+ Mở một tập tin văn bản để đọc/ghi

w+ Tạo ra tập tin văn bản để đọc ghi

a+ Nối vào hay tạo mới tập tin văn bản để đọc/ghi

r+b Mở ra tập tin nhị phân để đọc/ghi

w+b Tạo ra tập tin nhị phân để đọc/ghi

a+b Nối vào hay tạo mới tập tin nhị phân

Trang 13

Ví dụ tạo mới file text “test.txt” ở ổ đĩa D:

Trang 14

• Trả về EOF nếu có xuất hiện lỗi

• Đóng tất cả các tập tin lại: int fcloseall()

Trang 15

Thao tác trên File text

ĐỌC TẬP TIN

1 fscanf(FILE *, định dạng, các tham biến) Đọc dữ liệu từ tập tin fscanf(f, “%d”, &x);

2 fgets(chuỗi, kích thước tối đa, FILE *)

Đọc chuỗi ký tự từ tập tin với kích thước tối đa cho phép, hoặc gặp ký tự xuống dòng

char s[80];

fgets(s, 80, f);

3 getc(FILE *) Đọc ký tự từ tập tin char c=getc(f);

GHI TẬP TIN

1 fprintf(FILE *, định dạng, các tham biến) Ghi dữ liệu vào tập tin fprintf(f, “%d”, x);

Trang 16

Ví dụ

Tạo tập tin văn bản “so.out” gồm n số nguyên, các số của

dãy được tạo ngẫu nhiên có giá trị không vượt quá M (n, M

đọc từ tập tin “so.inp”) Kết quả chương trình là 1 tập tin

văn bản có dòng thứ nhất ghi số n; n dòng tiếp theo ghi các

số tạo được, mỗi số trên một dòng

File so.inp 3

10

File so.out 3 5 7 2

Trang 17

# define in “SO.INP”

# define out “SO.OUT”

void DocFile(int &n, int &M)

int main() {

int n, M;

srand((unsigned int)time(NULL));

DocFile(n, M);

GhiFile(n, M);

return 0;

}

Trang 18

Bài tập

Viết các hàm sau:

1 Tạo mảng 1 chiều số nguyên a (giá trị ngẫu nhiên < 100) có kích

thước n (0<n<10000) Lưu vào tập tin “mang.inp” theo định dạng:

• Dòng đầu tiên lưu giá trị n

• Dòng tiếp theo lưu các phần tử của mảng cách nhau bởi khoảng

trắng

2 Đọc mảng 1 chiều từ file “mang.inp” và sắp xếp mảng theo thứ tự tăng dần Lưu vào file “sapxep.out” theo cấu trúc tương tự câu 1.

Trang 19

Bài tập

Cho file “test.inp” có cấu trúc như sau

• Dòng đầu tiên là số nguyên n

• Dòng tiếp theo là n giá trị nguyên cách nhau bởi khoảng trắng

Hãy viết các hàm tìm phần tử có giá trị lớn nhất, phần tử nhỏ nhất, số lượng phần tử chẵn, lẻ Sau đó lưu vào file “kq.out” gồm các dòng sau:

• Dòng 1: So lon nhat la: …

• Dòng 2: So nho nhat la: …

• Dòng 3: So phan tu chan la: …

Trang 20

Thao tác trên File nhị phân

ĐỌC TẬP TIN

1 fread(&ptr, size, len, FILE *)

 ptr: vùng nhớ để lưu

dữ liệu đọc

 size: kích thước mỗi

ô nhớ (tính bằng byte)

 len: độ dài dữ liệu cần đọc

int a[30], b, n; fread(a,

sizeof(int), n , f); Fread(&b,

sizeof(int), 1 , f); GHI TẬP TIN

1 fwrite(&prt, size, len, FILE *) Tham số tương tự như hàm fread fwrite(a, sizeof(int), n , f);

Trang 21

Các thao tác khác trên File

Kiểm tra vị trí cuối cùng trong File

Trang 22

ĐỌC, GHI KIỂU CẤU TRÚC TRÊN FILE

Trang 23

Đọc kiểu cấu trúc trên file

int fread (void *p, int size , int n, FILE *fp);

• p: con trỏ trỏ tới vùng nhớ chứa dữ liệu đọc được

• size: kích thước của mẫu tin (byte)

• n: là số mẫu tin cần đọc

• fp: là con trỏ file

Hàm sẽ trả về một giá trị = số mẫu tin thực sự đọc được

Trang 24

Ghi kiểu cấu trúc trên file

int fwrite (void *p, int size , int n , FILE *fp);

• p: con trỏ trỏ tới vùng nhớ chứa dữ liệu cần ghi

• size: kích thước của mẫu tin (byte)

• n: số mẫu tin cần ghi

• fp: con trỏ file

Hàm sẽ trả về một giá trị = số mẫu tin thực sự ghi được

Trang 25

Ví dụ

Viết chương trình phát sinh ngẫu nhiên danh sách các tọa

độ điểm trong mặt phẳng Oxy (Giá trị của mỗi trục tọa độ

phát sinh trong khoảng [-50 50])

• Lưu danh sách này vào file “dsToaDo.inp”

• Đọc file “dsToaDo.inp” trên và lưu vào file

“toaDoDuong.out” những tọa độ điểm thuộc phần tư thứ

nhất

Trang 27

void PhatSinh( MyPoint *a, int n) {

for (int i = 0 ; i < n; i++) {

a[i] x = rand() % 51 - rand() % 51 ; a[i] y = rand() % 51 - rand() % 51 ; }

}

void XuatMang( MyPoint *a, int n) {

for (int i = 0 ; i < n; i++) {

printf("( %d , %d ); ", a[i] x , a[i] y );

Trang 28

void LuuFile( MyPoint *a, int n, char *fileName) { FILE *fp;

fp = fopen(fileName, "wb");

for (int i = 0 ; i < n; i++) {

fwrite(&a[i], sizeof( MyPoint ), 1 , fp);

}

fclose(fp);

}

Trang 29

void LuuToaDoDuong(char *fileIn, char *fileOut) {

FILE *fIn, *fOut;

Trang 30

void XuatFile(char *fileName) {

Trang 31

int main() {

MyPoint *a;

int n;

srand((unsigned int) time(NULL));

printf("So luong toa do can phat sinh: ");

LuuToaDoDuong("dsToaDo.inp", "toaDoDuong.out");

printf(" \n ***Danh sach toa do trong file: \n ");

Trang 32

Các thao tác khác trên File

• Xóa File

remove (đường dẫn tập tin);

• Đổi tên File

rename (tên tập tin cũ, tên tập tin mới);

• Cho biết vị trí con trỏ File

ftell (FILE *);

Trang 33

Các thao tác khác trên File

Di chuyển con trỏ File từ vị trí xuất phát cho trước

fseek (FILE *, độ dời, vị trí xuất phát);

Các vị trí:

• SEEK_SET đầu tập tin (giá trị 0)

• SEEK_END cuối tập tin (giá trị 2)

• SEEK_CUR vị trí hiện hành (giá trị 1)

Độ dời tính bằng byte

Trang 34

2 Bổ sung tọa độ điểm này vào cuối file “dsToaDo.inp”

3 Nếu tọa độ điểm vừa nhập có tọa độ thuộc phần tư thứ

nhất thì bổ sung thêm vào cuối file “toaDoDuong.out”

4 Xóa tọa độ điểm d cho trước (nếu có xuất hiện) trong file

“dsToaDo.inp” và “toaDoDuong.out”

Trang 35

Q&A

Ngày đăng: 15/05/2017, 10:28

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm