Bài 33 Các hàm vào ra tệp mức thấp

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 90 - 92)

/ *g ọi hàm g() biến b được cấp phát

Bài 33 Các hàm vào ra tệp mức thấp

Tóm tắt nội dung:

Có thể đọc ghi trực tiếp tệp dữ liệu (dạng nhị phân) trên UNIX bằng các hàm read() và write(). Các tệp được mở khi muốn đọc và ghi bằng hàm open(). Hàm close() cho phép đóng tệp.

Thời lượng: 1 tiết

Ngơn ngữ C ban đầu được thiết kế để viết các chương trình chạy trên UNIX. Khi đó việc đọc và ghi dữ liệu trên tệp được thực hiện thông qua các hàm thao tác trực tiếp với dữ liệu của tệp trên đĩa. Với phương thức vào ra này dữ liệu đọc/ghi chỉ là dữ liệu dạng byte nhị phân và khơng có vùng bộ nhớ đệm cho việc đọc/ghi. Chính vì vậy mà ta còn gọi phương thức vào ra là vào ra tệp mức thấp. Người lập trình được khuyến cáo là tránh sử dụng các hàm vào ra tệp mức thấp vì các hàm này khơng đảm bảo tính khả chuyển trên nhiều hệ thống khác nhau.

Một số hàm vào ra tệp mức thấp (<io.h>)

int open(char *filename, int flag[, int perms]); /* mở tệp */ int close(int handle); /* đóng tệp có thẻ tệp handle */ int creat(char *filename, int perms); /* tạo tệp */

int read(int handle, char *buffer, unsigned n); /* đọc dữ liệu trên tệp */ int write(int handle, char *buffer, unsigned n); /* ghi dữ liệu vào tệp */ long lseek(int handle, int offset, int whence); /* dịch chuyển con trỏ tệp */

Hàm mở tệp trả về kết quả là một thẻ tệp tương ứng cho tệp đã được mở. Tất cả các tệp khi được mở trong một hệ thống đều được quản lí thơng qua một thẻ tệp. Nhờ những thẻ tệp này mà hệ điều hành biết được tệp nào đang hay không được mở bởi ứng dụng để tránh sự tương tranh.

Kết quả là -1 nếu tệp không thể mở được. Giá trị hằng số cờ (flag) cho hàm mở tệp được định nghĩa trong tệp tiêu đề <fcntl.h>.

Một số hằng số chế độ mở tệp hay dùng

Hằng số Ý nghĩa

O_APPEND Ghi vào cuối tệp

O_CREAT Tạo tệp với tham số perms O_RDONLY Mở để chỉ đọc

O_RDWR Mở để đọc và ghi

O_TRUNC Xoá nội dung tệp hiện đang có O_WRONLY Mở để chỉ ghi

Tham số perms chỉ có ý nghĩa với chế độ mở O_CREAT (các chế độ khác đặt perms = 0) để xác lập quyền cho một tệp được tạo ra (vì trên UNIX mỗi tệp có thuộc tính quyền truy nhập). Tham số này có thể nhận giá trị là các hằng số định nghĩa trong <sys/stat.h>.

Hằng số quyền Ý nghĩa

S_IWRITE Cho phép ghi

S_IREAD Cho phép đọc S_IWRITE| S_IREAD Cho phép cả đọc và ghi

Hai hàm read(), write() cho phép đọc/ghi dữ liệu trên tệp vào bộ nhớ buffer của chương trình với kích thước n bytes. Kết quả trả về của hai hàm này là số bytes thực sự đã đọc/ghi. Nếu trả về -1 có nghĩa là việc đọc/ghi bị lỗi. Đối với hàm read() khi đọc trả về 0 có nghĩa là dữ liệu đã đọc hết và con trỏ đã đến cuối tệp. Ý nghĩa của các tham số truyền vào cho hàm lseek() giống hàm fseek().

Ví dụ:

/* chương trình đọc số thực trong một tệp nhị phân số nguyên đầu tiên là số số thực trong file */

#include<stdio.h> #include<fcntl.h>

#define FILENAME "reals.dat" float bigbuff[1000]; main() { int fd, file_length; if ( (fd = open(FILENAME,O_RDONLY)) == -1) {

perror("Loi tep khong mo duoc"); exit(1);

}

if (read(fd,&file_length, sizeof(int)) == -1) {

perror("Loi dinh dang tep du lieu"); exit(1);

if (read(fd, bigbuff, file_length*sizeof(float)) == -1) {

perror("Loi doc doc du lieu"); exit(1);

} (adsbygoogle = window.adsbygoogle || []).push({});

printf("Da doc tep xong"); close(fd);

}

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 90 - 92)