Tải bản đầy đủ (.pdf) (53 trang)

Bài giảng kỹ thuật lập trình chương 4 Tập tin (file)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (793.5 KB, 53 trang )

Tập tin
(FILE)
Trịnh Tấn Đạt
Khoa CNTT - Đại Học Sài Gòn
Email:
Website: />

Nội dung


Khái niệm về Stream (luồng)



Khái niệm về FILE



Các thao tác cơ bản với file trong C
o Mở/Đóng FILE
o Đọc/Ghi FILE
o Con trỏ FILE
o Binary FILE (option)
o FILE và mảng



Bài Tập




Các thao tác cơ bản với file trong C ++ (tìm hiểu thêm - option)


Stream


Dữ liệu trong chương trình (biến, mảng, cấu trúc, hàm, …) được lưu trữ tạm trong
bộ nhớ RAM.



Dữ liệu được lưu vào RAM và gửi ra ngồi chương trình thơng qua các thiết bị
(device)
o Thiết bị nhập (input device): bàn phím, mouse, …
o Thiết bị xuất (output device): màn hình, máy in, …
o Thiết bị vừa nhập vừa xuất: tập tin



Các thiết bị đều thực hiện mọi xử lý thông qua các luồng (stream).


Stream


Hệ thống nhập/xuất của C cung cấp cho người dùng một môi trường độc lập với
thiết bị đang truy cập.




Môi trường này là một sự biểu diễn trừu tượng của thiết bị gọi là một stream và
thiết bị thật sự được gọi là tập tin (file).



Stream: là một môi trường trung gian để giao tiếp (nhập/xuất thơng tin) giữa
chương trình và thiết bị.



Muốn nhập/xuất thông tin cho một thiết bị chúng ta sẽ gửi thông tin cho stream
nối với thiết bị đó (độc lập với thiết bị).



Stream là dãy byte dữ liệu:
o Input stream
o Output stream


Stream
❖ Stream chia thành 02 loại: stream văn bản và stream nhị phân


Stream văn bản (text)
o Chỉ chứa các ký tự.
o Tổ chức thành từng dòng, mỗi dòng tối đa 255 ký tự, kết thúc bởi ký tự cuối dòng '\0' hoặc ký tự
sang dòng mới '\n'.




Stream nhị phân (binary)
o Chứa các byte.
o Được đọc và ghi chính xác từng byte.
o Xử lý dữ liệu bất kỳ, kể cả dữ liệu văn bản.
o Được sử dụng chủ yếu với các tập tin trên đĩa


Stream


Các stream chuẩn định nghĩa sẵn
Tên

Stream

Thiết bị tương ứng

stdin

Nhập chuẩn

Bàn phím

stdout

Xuất chuẩn

Màn hình


stderr

Lỗi chuẩn

Màn hình

stdprn

In chuẩn

Máy in (LPT1:)

Ví dụ (hàm fprintf xuất ra stream xác định)
• Xuất ra màn hình:
fprintf(stdout, "Hello");
• Xuất ra máy in:
fprintf(stdprn, "Hello");
• Xuất ra thiết bị báo lỗi:
fprintf(stderr, "Hello");
• Xuất ra tập tin (stream fp): fprintf(fp, "Hello");


FILE (tập tin)
▪ Theo định nghĩa trên Wikipedia về computer file: Một file trên máy
tính là một tài nguyên dùng để lưu trữ thông tin lâu dài, sử dụng cho
các chương trình máy tính.
▪ Tại sao cần tập tin:
o Dữ liệu giới hạn và được lưu trữ tạm thời
• Nhập: gõ từ bàn phím.
• Xuất: hiển thị trên màn hình.

• Lưu trữ dữ liệu: trong bộ nhớ RAM.

 Mất thời gian, khơng giải quyết được bài tốn với số dữ liệu lớn.
o Cần một thiết bị lưu trữ sao cho dữ liệu vẫn cịn khi kết thúc chương trình, có
thể sử dụng nhiều lần và kích thước khơng hạn chế.


FILE


Trong ngơn ngữ lập trình C/C++: File là kiểu đối tượng chứa các thông tin cần
thiết để điều khiển, bao gồm một con trỏ trỏ đến buffer của nó, các chỉ mục và
trạng thái của nó.



File là một kiểu dữ liệu có cấu trúc.



Là một dãy các byte ghi trên đĩa. Số byte của dãy chính là độ dài của file.



Được lưu trữ trong các thiết bị lưu trữ ngoài như đĩa mềm, đĩa cứng, USB…
o Vẫn tồn tại khi chương trình kết thúc.
o Kích thước khơng hạn chế (tùy vào thiết bị lưu trữ)




Có hai kiểu nhập/xuất dữ liệu lên file: nhị phân và văn bản.



Làm việc với File chúng ta chỉ có các thao tác cơ bản như: tạo file mới, đọc dữ
liệu trong file, ghi dữ liệu vào file, xóa file...



Trong lập trình C, dùng thư viện <stdio.h> để thao tác trên FILE


FILE
❖ Tập tin văn bản : là kiểu tập tin được lưu trữ các thông tin dưới dạng kiểu ký tự.




Mỗi dòng dài tối đa 255 ký tự và kết thúc bằng ký hiệu cuối dòng (end_of_line).
Truy xuất tập tin văn bản:
o theo từng ký tự
o theo từng dòng

❖ Tập tin nhị phân :


Dữ liệu được đọc và ghi một cách chính xác, khơng có sự chuyển đổi nào cả.




Ký tự kết thúc chuỗi '\0' và end_of_line khơng có ý nghĩa là cuối chuỗi và cuối
dòng mà được xử lý như mọi ký tự khác.


Định vị tập tin
❖ Đường dẫn (path)



Chỉ đến một tập tin khơng nằm trong thư mục hiện hành. Ví dụ:
F:\folder1\file1.txt chỉ tập tin file1.txt nằm trong thư mục folder1 của ổ đĩa F.



Trong chương trình, đường dẫn này được ghi trong chuỗi như sau:
"F:\\folder1\\file1.txt"


Qui trình làm việc với FILE
1. Mở tập tin: tạo một stream nối kết với tập tin cần mở, stream được
quản lý bởi biến con trỏ đến cấu trúc FILE
o Cấu trúc được định sẵn trong thư viện stdio.h
o Các thành phần của cấu trúc này được dùng trong các thao tác xử lý tập tin.

2. Sử dụng tập tin (sau khi đã mở được tập tin)
o Đọc dữ liệu từ tập tin đưa vào chương trình.
o Ghi dữ liệu từ chương trình lên tập tin.

3. Đóng tập tin (sau khi sử dụng xong).



Các thao tác cơ bản với file trong C
❖ Khai báo và sử dụng FILE : Kiểu FILE *



Cú pháp : FILE *ten_con_tro_file;

Ví dụ: FILE *f, *g;


/* Khai báo hai biến con trỏ tập tin*/

Để làm việc với file, chúng ta cần biết vị trí của file (thơng qua đường dẫn) để con trỏ kiểu FILE
có thể tạo được luồng dữ liệu giữa người dùng và file trên thiết bị lưu trữ.

Ví dụ: một file văn bản (*.txt) hoặc dạng (*.INP) được lưu trữ như sau
C:\Desktop\my_document.txt
Trong C khai báo con trỏ đến chuỗi ký tự lưu trữ đường dẫn và tên file
const char *filePath = "C:\\Desktop\\my_document.txt"; // con trỏ đén hằng số kiểu chuỗi
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
const char *filePath = "C:\\Desktop\\my_document.txt";
FILE *fp;
return 0;
}



FILE
❖ Open file (Mở FILE): Để mở một file, các bạn có thể sử dụng hàm fopen



Cú pháp:
FILE* fopen(const char *filename, const char *mode);

Trong đó :
• filename: tên tập tin cần mở. Có thể chỉ định một đường dẫn đầy đủ chỉ đến vị trí của
tập tin.
• mode: chế độ mở tập tin: chỉ đọc, để ghi (tạo mới), ghi thêm. Để mở file dạng văn bản
dùng mode “t”


Hàm dùng để mở file. Nếu thành công hàm cho con trỏ kiểu FILE ứng với file vừa
mở. Các hàm liên quan khác sẽ làm việc với file thông qua con trỏ này. Nếu có lỗi
hàm sẽ trả về giá trị NULL.


Mở FILE


Mode: open file


Mở FILE



Ví dụ
const char *filePath = "C:\\Desktop\\my_document.txt";
FILE *fp;
fp = fopen(filePath, "rt"); // doc file van ban
if (!fp) // (fp == NULL)
cout << "Can not open this file" << endl;
else
cout << "File is opened" << endl;


Đóng FILE
❖ Đóng file (close FILE): Sau khi thao tác với file xong, các bạn cần đóng file lại để tránh những lỗi
phát sinh ngồi ý muốn. Để đóng file, chúng ta sử dụng hàm fclose:



int fclose(FILE *fp);
Cú pháp :
o fp: là con trỏ được dùng để lưu trữ địa chỉ của đối tượng FILE đang mở. Nếu đóng file thành
cơng thì trả về giá trị 0, ngược lại trả về EOF (End of file)



Hàm fclose sẽ giải phóng tất cả dữ liệu chưa được xử lý trên file nếu chúng vẫn cịn lưu trong
buffer, đóng file lại, và giải phóng tất cả vùng nhớ mà đối tượng FILE sử dụng.
const char *filePath = "C:\\Desktop\\my_document.txt";
FILE *fp;
fp = fopen(filePath, "rt");
if (!fp)
// (fp == NULL)

cout << "Can not open this file" << endl;
else
cout << "File is opened" << endl;
fclose(fp);


FILE
❖ Làm sạch vùng đệm - hàm fflush
▪ Cú pháp:

int fflush(FILE *fp);


Dùng làm sạch vùng đệm của tệp fp. Nếu lệnh thành công, hàm sẽ cho giá trị 0,
trái lại nó cho hàm EOF.



Ví dụ: fflush(fp); // fp là con trỏ FILE


Đọc và ghi dữ liệu (stdio.h)
❖ Thực hiện đọc/ghi dữ liệu theo các cách sau:
▪ Nhập/xuất theo định dạng
o Hàm: fscanf, fprintf
o Chỉ dùng với tập tin kiểu văn bản.

▪ Nhập/xuất từng ký tự hay dòng lên tập tin
o Hàm: getc, fgetc, fgets, putc, fputs
o Chỉ nên dùng với kiểu văn bản.


▪ Đọc/ghi trực tiếp dữ liệu từ bộ nhớ lên tập tin
o Hàm: fread, fwrite
o Chỉ dùng với tập tin kiểu nhị phân.


Ghi FILE
❖ Ghi dữ liệu vào FILE.



Để mở file cho chế độ ghi file, chúng ta có các mode "w", "w+", "a", "a+".

Ví dụ: Giả sử đọc file và dùng con trỏ fie để quản lý

const char *filePath = "C:\\Desktop\\my_document.txt";
FILE *fp;
fp = fopen(filePath, "wt"); // ghi file
if (!fp)
// (fp == NULL)
cout << "Can not open this file" << endl;
else
cout << "File is opened" << endl;
// ghi dữ liệu lên file // code here

fclose(fp);


Ghi FILE
❖ Các hàm cơ bản để ghi FILE




Hàm fputc:
int fputc(int c, FILE *fp);



Hàm fputc sẽ ghi ký tự có mã ASCII là biến c vào file được trỏ đến bởi con trỏ fp.



Giá trị trả về là EOF nếu ghi dữ liệu thất bại, trả về mã ASCII của kí tự được ghi vào nếu thực hiện
thành cơng.

Ví dụ:

FILE *fp= fopen(filePath, "wt"); // dùng con trỏ file fp
int c = fputc('A', fp);

cout << c << endl;

// ghi ký tự A vào file my_document.txt


Ghi FILE
❖ Các hàm cơ bản để ghi FILE




Hàm fputs:
int fputs(const char *str, FILE *fp);



Hàm fputs ghi một C-Style string vào file được trỏ đến bởi con trỏ fp cho đến khi gặp kí tự '\0'

Ví dụ:
FILE *fp= fopen(filePath, "wt"); // dùng con trỏ file fp
fputs("Hello World", fp);

// ghi chuỗi Hello World vào file my_document.txt


Ghi FILE
❖ Các hàm cơ bản để ghi FILE



Hàm fprintf :

int fprintf(FILE *fp, const char *format, ...);


Hàm fprintf tương tự hàm printf trong ngôn ngữ C nhưng được dùng để ghi dữ liệu lên file

Ví dụ:

FILE *fp = fopen(filePath, "wt"); // dùng con trỏ file fp
for (int i = 1; i <= 5; i++)

fprintf(fp, "This is an example line %d\n", i);
int i = 10; int c = 'A'; float f = 7.5;
fprintf(fp, "%d %c %.2f\n", i, c, f);
Lưu ý: Nếu fp là stdout thì hàm giống printf


Ghi FILE


Ví dụ ghi FILE dùng hàm void writeToFile(FILE *file)

const char *filePath = "C:\\Desktop\\my_document.txt";
FILE *fp;
fp = fopen(filePath, "wt");
if (!fp)
// (fp == NULL)
cout << "Can not open this file" << endl;
else
cout << "File is opened" << endl;
writeToFile(fp); // dinh nghia ham ghi FILE
fclose(fp);
void writeToFile(FILE *file)
{
for (int i = 1; i <= 5; i++)
fprintf(file, "This is an example line %d\n", i);
}


Đọc FILE
❖ Đọc dữ liệu từ FILE




Để đọc dữ liệu từ file, yêu cầu file đó đã tồn tại và được lưu trữ sẵn. Ngược lại sẽ xuất hiện lỗi (file
chưa tồn tại)



Để mở file cho chế độ đọc file, chúng ta có các mode "r", "r+", "a", "a+".
const char *filePath = "C:\\Desktop\\my_document.txt"; // file này đã tồn tại
FILE *fp;
fp = fopen(filePath, "rt"); // che do doc file
if (!fp)
// fp == NULL
cout << "Can not open this file" << endl;
else
cout << "File is opened" << endl;
// đọc dữ liệu từ file // code here
fclose(fp);


Đọc FILE
❖ Các hàm cơ bản để đọc FILE



Hàm fgetc:
int fgetc(FILE *fp);




Hàm fgetc đọc ra một kí tự trong file, internal file position indicator sẽ chuyển đến kí tự tiếp theo.
Giá trị trả về là mã ASCII của kí tự đã đọc được.

Ví dụ: FILE *fp = fopen(filePath, "rt"); // dùng con trỏ file fp

cout << (char)fgetc(fp) << endl;


×