6.2 Khai báo kiểu tệp tin www.themegallery.com
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 4
Trong C++, để làm việc với các hàm xử lý file cần khai báo đầu
chương trình: #include
Trong thư viện fstream thì ta có 3 loại File stream cơ bản sau :
ifstream : Dùng cho file nhập vào. Loại này chỉ có thể được
dùng để đọc dữ liệu từ file vào bộ nhớ mà thôi.
ofstream : Dùng cho file xuất ra. Loại này thì có thể dùng để
tạo ra files và chép dữ liệu vào chúng.
fstream : Đây là kênh file.(File stream). Loại này thì có thể
vừa tạo file, vừa ghi dữ liệu vào file và đọc dữ dữ liệu từ file
vào luôn.
24 trang |
Chia sẻ: thanhle95 | Lượt xem: 509 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng Kỹ thuật lập trình - Chương VI: Tệp tin, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
LOGO
Chương VI
Tệp Tin
COMPANY LOGO
www.themegallery.com
Nội dung chính
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 2
Dẫn nhập6.1
Khai báo kiểu tệp tin6.2
Các thao tác truy xuất tệp tin6.3
Các hàm tệp tin6.4
COMPANY LOGO
www.themegallery.com
6.1 Dẫn nhập
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 3
4
3
2
1
Tạo đối tượng file
Mở file
Thao tác với tệp
Đóng tệp
Quy trình làm việc với file
COMPANY LOGO
www.themegallery.com
6.2 Khai báo kiểu tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 4
Trong C++, để làm việc với các hàm xử lý file cần khai báo đầu
chương trình: #include
Trong thư viện fstream thì ta có 3 loại File stream cơ bản sau :
ifstream : Dùng cho file nhập vào. Loại này chỉ có thể được
dùng để đọc dữ liệu từ file vào bộ nhớ mà thôi.
ofstream : Dùng cho file xuất ra. Loại này thì có thể dùng để
tạo ra files và chép dữ liệu vào chúng.
fstream : Đây là kênh file.(File stream). Loại này thì có thể
vừa tạo file, vừa ghi dữ liệu vào file và đọc dữ dữ liệu từ file
vào luôn.
COMPANY LOGO
www.themegallery.com
6.2 Khai báo kiểu tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 5
Để định nghĩa một đối tương file ta chọn các cách sau:
Nếu sử dụng thư viện stdio.h trong C thì để định nghĩa một
đối tượng file ta sử dụng biến con trỏ như sau:
Trong đó DataFile là tên do người dùng đặt theo quy tắc định
danh.
fstream DataFile;
FILE *DataFile;
ifstream DataFile;
ofstream DataFile;
COMPANY LOGO
www.themegallery.com
6.3 Các thao tác truy xuất tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 6
A. Sử dụng #include
Ví dụ 1: Tạo và ghi dữ liệu vào file cùng thư mục trong project.
#include
#include
using namespace std;
int main()
{
ofstream FileDemo; //Định nghĩa đối tượng file là FileDemo
FileDemo.open("ViDu.txt"); //Tạo và mở file với tên ViDu.txt
FileDemo << "Vi du ve ghi du lieu vao file\n";
// Sử dụng toán tử << để xuất dữ liệu trong cặp ngoặc"" ra file ViDu.txt
FileDemo.close(); //Đóng đối tượng file
cout<<"File ViDu.txt da duoc ghi thanh cong\n";
}
COMPANY LOGO
www.themegallery.com
6.3 Các thao tác truy xuất tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 7
Ví dụ 2: Tạo và ghi dữ liệu vào file trong ổ đĩa hoặc thư mục.
#include
#include
using namespace std;
int main()
{
fstream ViDu2("D://Demo1.txt",ios::out);
/*Định nghĩa đối tượng file ViDu2 đồng thời tạo và mở file
Demo1.txt tại một đường dẫn (ở đây là ổ D)*/
for(int i=0; i<100; i+=2)
ViDu2 << i<<"\n"; //Ghi các số chẵn <100 vào file Demo1.txt
ViDu2.close(); //Đóng đối tượng file
}
COMPANY LOGO
www.themegallery.com
6.3 Các thao tác truy xuất tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 8
Chú ý:
Trong 1 đối tượng file, khi đang mở 1 tệp tin, muốn mở và thao
tác với tệp tin khác thì ta phải đóng lại tệp hiện hành.
Nếu sử dụng fstream để định nghĩa đối tượng file thì khi dùng
lệnh mở 1 file (.open) thì nhất thiết phải thêm tham số thứ 2 để
biểu thị chế độ mà ta mở file:
ios::out - Mở file ở chế độ xuất ra, chế độ này cho phép
ghi dữ liệu vào file.
ios::in - Mở file ở chế độ nhập vào, tức là cho phép dữ liệu
được đọc từ file.
ios::app - Chế độ gắn vào. Nếu file đã được tạo thì nội
dung của nó sẽ được thêm vào cuối của file. Nếu file chưa
được tạo nó sẽ tạo ra 1 file mới.
COMPANY LOGO
www.themegallery.com
6.3 Các thao tác truy xuất tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 9
Chú ý (tiếp):
ios::ate - Nếu file đã được tạo, thì chương trình sẽ chuyển
con trỏ về cuối file.
ios::binary - Chế độ nhị phân. Khi mà file được mở ra ở
chế độ này thì dữ liệu sẽ được đọc hay ghi từ 1 định dạng
nguyên thủy nhị phân.
ios::trunc - Nếu file đã được tạo thì nội dung của nó sẽ bị
xóa đi.
ios::nocreate - Không làm gì nếu file chưa có.
ios::replace - Không làm gì nếu file đã có.
Để kết hợp các chế độ ta dung toán tử |.
Khi dùng riêng lẻ thì ios::out sẽ xóa nội dung của file nếu file
đã được tạo sẵn. Tuy nhiên nếu dùng chung với ios::in, thì nội
dung file cũ sẽ được giữ lại.
COMPANY LOGO
www.themegallery.com
6.3 Các thao tác truy xuất tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 10
Ví dụ 3: Đọc dữ liệu từ file dùng toán tử >>.
#include
#include
using namespace std;
int main()
{
ifstream dataFile;
char data[1000];// Chuỗi này để lưu dữ liệu từ file
dataFile.open("Demo1.txt");
while (dataFile >>data) // Toán tử >> để ghi dữ liệu vào chuỗi data
cout << data<<" ";
dataFile.close();
}
COMPANY LOGO
www.themegallery.com
6.3 Các thao tác truy xuất tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 11
Ví dụ 4: Đọc dữ liệu từ file dùng hàm getline
#include
#include
using namespace std;
int main()
{
ifstream dataFile;
char data[1000];// Chuỗi này để lưu dữ liệu từ file
dataFile.open("Demo1.txt");
dataFile.getline(data,1000);
cout << data;
dataFile.close();
}
COMPANY LOGO
www.themegallery.com
6.3 Các thao tác truy xuất tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 12
B. Sử dụng #include
Đầu tiên khai báo con trỏ FILE *f;
Mở file: f = fopen(“path”,”chế độ mở”);
path - Đường dẫn của file;
Chế độ mở - Xem ở trang 14 của slide;
Đọc dữ liệu từ file :
fscanf(f, “%d”, &x); /*Đọc dữ liệu dạng số nguyên từ file
cho vào biến x */
char s[80]; fgets(s, 80, f); /*Đưa vào chuỗi s tối đa 80 kí tự
lấy từ file */
char c=getc(f); //Đọc 1 kí tự từ file lưu vào biến c
Ghi dữ liệu vào file:
fprintf(f,“%d”,x); // Xuất giá trị nguyên x ra file
fputs(“Ky Thuat Lap Trinh”, f); //Xuất chuỗi ra file
COMPANY LOGO
www.themegallery.com
6.3 Các thao tác truy xuất tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 13
B. Sử dụng #include
Ví dụ 1: Mở và ghi dữ liệu lên file.
#include
int main()
{
FILE *data; // khai báo con trỏ data dạng FILE
data = fopen("vdc.txt","w"); //w là chế độ xử lý file
//Mở file vdc.txt để ghi dữ liệu lên đó ( w – ý nghĩa là mở để ghi)
fprintf(data, "Day la vi du ve ghi du lieu len file");
//Hàm fprintf dùng để ghi dữ liệu vào file
fclose(data);// Đóng file
}
COMPANY LOGO
www.themegallery.com
6.3 Các thao tác truy xuất tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 14
Các chế độ xử lý file:
"r" - Mở một file có sẵn để đọc.
"w" - Tạo file mới để ghi, nếu file có sẵn thì sẽ bị ghi mới
hoàn toàn.
"a" - Mở một file để ghi từ vị trí cuối cùng của file, nếu file
không tồn tại sẽ tạo mới.
"r+" - Mở một file có sẵn để đọc và ghi.
"w+" - Tạo file mới để đọc và ghi, nếu file có sẵn thì sẽ bị ghi
mới hoàn toàn.
"a+" - Mở một file để để đọc và ghi. Có thể đọc từ đầu file,
nhưng khi ghi thì ghi từ vị trí cuối cùng của file, nếu file không
tồn tại sẽ tạo mới.
COMPANY LOGO
www.themegallery.com
6.3 Các thao tác truy xuất tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 15
B. Sử dụng #include
Ví dụ 2: Mở và đọc dữ liệu từ file.
#include
int main()
{
FILE *data;
char dulieu[1000];// dùng để chứa nội dung file
data = fopen("vdc.txt","r"); //mở file vdc.txt ở chế độ để đọc
while(fscanf(data, "%s", dulieu)!=EOF)
/*Sử dụng hàm fscanf để đọc dữ liệu từ file, EOF (end of file) –
Nghĩa là đọc đến cuối file.*/
printf("%s ", dulieu);/* Hiển thị nội dung file đã lưu trong chuỗi
dulieu */
fclose(data); // Đóng file
}
COMPANY LOGO
www.themegallery.com
6.4 Các hàm tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 16
A. Hàm get() - Đọc một kí tự bất kì từ file.
Ví dụ sau sẽ xuất ra màn hình nội dung của tệp Demo1.txt
#include
#include
using namespace std;
int main()
{
ifstream dataFile;
char data;
dataFile.open("Demo1.txt");
while(dataFile.get(data))
cout<<data;
dataFile.close();
}
COMPANY LOGO
www.themegallery.com
6.4 Các hàm tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 17
B. Hàm put() - Ghi một kí tự vào file.
Ví dụ sau sẽ ghi nội dung 1 câu văn vào file Vidu.txt
#include
#include
using namespace std;
int main()
{
char ch;
fstream dataFile("Vidu.txt", ios::out);
cout << "Nhap noi dung muon ghi va ket thuc bang dau cham :\n";
cin.get(ch);
while (ch != '.')
{ dataFile.put(ch); cin.get(ch); }
dataFile.put(ch); //Ghi dấu chấm cuối câu.
dataFile.close();
}
COMPANY LOGO
www.themegallery.com
6.4 Các hàm tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 18
C. Hàm write() - Ghi file ở dạng nhị phân.
Cách dùng như sau:
fileObject - Đối tượng file.
address – Địa chỉ đầu tiên của 1 vùng nhớ được ghi vào file.
size – Số lượng byte của vùng nhớ mà nó sẽ được ghi.
Ví dụ 1:
Ví dụ 2:
fileObject.write(address, size);
char kitu = 'A';
file.write(&kitu, sizeof(kitu));
char Data[] = {'A', 'B', 'C', 'D'};
file.write(Data, sizeof(Data));
COMPANY LOGO
www.themegallery.com
6.4 Các hàm tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 19
D. Hàm read() - Đọc dữ liệu nhị phân từ file vào bộ nhớ.
Cách dùng như sau:
fileObject - Đối tượng file.
address – Là địa chỉ đầu tiên mà vùng nhớ mà dữ liệu được
đọc vào được lưu.
size – Số lượng byte trong bộ nhớ được đọc vào từ file.
Ví dụ 1:
Ví dụ 2:
fileObject.read(address, size);
char kitu = 'A';
file.read(&kitu, sizeof(kitu));
char Data[5]
file.read(Data, sizeof(Data));
COMPANY LOGO
www.themegallery.com
Ví dụ sử dụng hàm write() và hàm read()
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 20
#include
#include
using namespace std;
int main()
{
const int SIZE = 4;
char data[SIZE] = {'A', 'B', 'C', 'D'}, data2[SIZE];
fstream file;
file.open("VD.dat", ios::out | ios::binary);
file.write(data, sizeof(data));
file.close();
file.open("VD.dat", ios::in | ios::binary);
file.read(data2, sizeof(data2));
for (int count = 0; count < SIZE; count++)
cout << data2[count] << " ";
cout << endl; file.close();
}
COMPANY LOGO
www.themegallery.com
6.4 Các hàm tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 21
E. Hàm xóa và đổi tên file :
remove ( “đường dẫn tập tin” );
rename ( “ tên tập tin cũ “, “ tên tập tin mới “ );
F. Các hàm di chuyển con trỏ file
o seekp(n) - Di chuyển con trỏ đến byte thứ n (các byte được
tính từ 0).
o seekp(n, vị trí xuất phát) - Di chuyển đi n byte (có thể âm
hoặc dương) từ vị trí xuất phát. Vị trí xuất phát gồm:
• ios::beg : Từ đầu file
• ios::end : Từ cuối file
• ios::cur : Từ vị trí hiện tại của con trỏ.
o tellp(n) - Cho biết vị trí hiện tại của con trỏ.
o Để làm việc với dòng nhập tên các phương thức trên được thay
tương ứng bởi các tên : seekg và tellg
COMPANY LOGO
www.themegallery.com
6.4 Các hàm tệp tin
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 22
G. Hàm gcount() - Cho biết số kí tự hàm read đọc được
H. Một số hàm khác sinh viên tự tìm hiểu : fread(), fwrite(),
fseek(), ftell(),
COMPANY LOGO
www.themegallery.com
Bài tập chương 6
Trường ĐH GTVT TP.HCM - Bài giảng : Kỹ thuật lập trình 23
Bài 1. Viết chương trình tạo ra 1 tệp tin với dữ liệu là các số
nguyên từ 1 đến 100.
Bài 2. Nhập một dãy số gồm n phần tử số nguyên rồi lưu vào tệp
tin 1.txt
A. Sắp xếp các số trong tệp 1.txt và lưu kết quả vào tệp 2.txt
B. Xóa tệp 1.txt và đổi tên tệp 2.txt thành sort.txt
C. Thêm vào cuối tệp sort.txt số 2015
Bài 3. Tạo một file với thông tin gồm danh sách các sinh viên và
điểm số của họ. Tìm những sinh viên trong file đó sao cho điểm
số >=7 và lưu kết quả sang 1 file mới.
Bài 4. Viết chương trình tìm xâu dài nhất trong một file văn bản.
Bài 5. Viết Chương trình để tổ chức và quản lý file sinh viên (Họ
tên, ngày sinh, giới tính, điểm các môn) với các chức năng :
Nhập, xem, xóa, sửa.
LOGO
www.themegallery.com