Linux và Unix cung cấp hai cách truy cập file.
- System call
- Thư viện chuẩn stdio
Thư viện chuẩn khá quen thuộc do nó nằm ở lớp cao nên thư viện chuẩn tương tự như nhau cho hầu hết hđh ( cả Window và Linux). Những hàm xử lí file ở mức thấp hơn là System call, hay còn gọi là mức kernel. Dĩ nhiên nó chạy trong kernel space.
Thực tế thì thư viện stdio chạy ở mức user space, khi được triệu gọi nó sẽ chuyển sang kernel space xử lí. Các system call sẽ có trách nhiệm truy xuất xuống phần cứng. Việc truy xuât file đã khá quen thuộc đối với chúng ta với thư viện chuẩn. Bài viết này tui lặp lại cách truy xuất bằng thư viện chuẩn. Còn phần truy xuất file bằng system call sẽ post phần sau.
Chúng ta sử dụng thư viện chuẩn của C để xuất nhập file. Các hàm xử lí file bao gồm:
- fopen
- fclose
- fread, fwrite
- fflush, fseek
- fgetc, getc, getchar
- fputc, putc, putchar
- fgets, gets
- printf, fprintf
- scanf, fscanf
Tất cả hàm này được khai báo trong stdio.h
Đóng mở file
Giả sử chúng ta muốn mở file /home/user/data.text
FILE* f_read;
FILE* f_write;
FILE* f_append;
f_read = fopen("/home/user/data.text", "r"); // mở file để đọc
f_write = fopen("/home/user/data.text", "w"); //mở file để ghi
// Mở file để thêm dữ liệu vào cuối file
f_append = fopen("/home/user/data.text", "a");
Một khi đã mở file và thực hiện xong thao tác cần thiết các bạn phải đóng file lại
if(!fclose(f_read)
{
perror("Dong file khong duoc: /home/user/data.text");
exit(1);
}
Đọc dữ liệu file đang mở
int c;
char buf[500];
Đọc từng kí tự
c= fgetc(f_read);
Đọc theo từng khối
if ( fread(buf, 499, 1, f_read)) perror("fread");
Kiểm tra đến cuối file chưa
if ( feof(f_read)) printf("Den cuoi file gu`i");
Để ghi dữ liệu
FILE* file_rw;
file_rw = fopen(/home/user/data.text);
char buf[200];
strcpy(buf, "Hello, my friend");
fputs(buf, file_rw);
fflush(file_rw);