Bài giảng Lập trình nâng cao: Thao tác với tệp cung cấp cho người học các kiến thức: Nhập liệu từ tệp văn bản, xử lý lỗi với tệp, kỹ thuật giới thiệu các thư viện, kỹ thuật xử lý lỗi đơn giản. Mời các bạn cùng tham khảo.
Trang 1File operations
5 - Thao tác với tệp
https://github.com/tqlong/advprogram
Trang 2Nội dung
<fstream>, <vector>, <algorithm>
○ Xử lý lỗi đơn giản
Trang 3Nhập liệu từ tệp (file)
Trang 4Top-down: Sửa main để dùng file
const int M AX_BAD _G U ESSES = 7;
con st ch ar D ATA _FILE[] = "data/O gd en_P icturable_200.txt";
string guessedW ord = string(w ord.length(), '-');
- Yêu cầu chooseWord chọn từ file
- Báo lỗi và dừng game nếu file có lỗi
Trang 5Thư viện fstream
Trang 6Tạo file, ghi vào file với ofstream
// thư viện fstream
# include < fstream >
int m ain () {
ofstream m yfile; // khai báo biếến kiếểu ofstream
m yfile.open("exam ple.txt"); //M ởể file exam ple.txt
m yfile < < "W riting this to a file.\n"; //G hi văn baển vào file
m yfile.close(); //Đ óng file lại: giaểi phóng tài nguyến, ghi vào đĩa
● Biến kiểu ofstream (out file stream)
Trang 7Tạo file, ghi vào file với ofstream
# include < iostream >
# include < fstream >
int m ain () {
ofstream m yfile ("exam ple.txt");
if (m yf i le.is_open()) { // Kiếểm tra việc m ởể tệp có thành công?
m yfile < < "This is a line.\n";
m yfile < < "This is another line.\n";
Trang 8Đọc file với ifstream
# include < fstream > //Thư viện fstream chứa ifstream
using nam espace std;
int m ain () {
string line;
ifstream m yfi le ("exam ple.txt"); //Mở file example.txt đã ghi ở ví dụ trước
(m yfi le.is_open()) { //Kiểm tra việc mở tệp có thành công ?
w h ile ( getline (m yfi le,line) ) { //Hàm getline đọc 1 dòng của tệp vào biến line
cout < < line < < '\n' ; // và chuyển vị trí đọc xuống dòng tiếp theo
} // Lặp đến khi getline trả về “false” (tức là không còn gì để đọc, hết tệp)
m yfi le.close(); //Đóng tệp, giải phóng tài nguyên hệ thống
}
else cout < < "Unable to open fi le";
return ;
Trang 9Đọc từ vựng Hangman từ tệp
Từ vựng của Hangman được lưu trong một tệp văn bản:
chooseWord, hiện là main())
Trang 10string chooseW ord(const char* fileN am e)
{
ifstream file(fileN am e); //Mở tệp có đường dẫn như trong tham số
if (file.is_open()) { // Kiểm tra tệp mở thành công
string w ord;
w hile (file > > w ord) { //Đọc từng từ đến khi không đọc được nữa
cout < < w ord < < endl; //ghi tạm ra màn hình để xem thử
}
file.close();
} else cout < < "Error opening " < < fileN am e;
}
chooseWord (thử đọc từ file)
Trang 11Ghi dữ liệu từ file vào đâu?
Từ vựng của Hangman được lưu trong một tệp văn bản:
→ Cần kiểu dữ liệu lưu trữ số lượng từ “tùy ý”
nếu dùng mảng thông thường ta sẽ phải đọc một lần để đếm số dòng trước khi khai báo mảng, sau đó mới đọc vào mảng.
Trang 12Thư viện vector
Trang 13Chèn vào cuối vector
Thư viện vector
cout < < "Please enter som e integers (Ctrl-D to end):\n
w h ile (cin > > m yint) {
Sưể dụng thư viện vector
Khai báo m yvector là vector các sôế nguyến
Lặp đếế n khi không còn dữ liệu m ới Phưởng thức push_back: Thếm m yint vào cuôế i m yvector
In sôế phầầ n tưể cu ểa m yvector
Trang 14Truy xuất các phần tử trong vector
Thư viện vector
vector<in t> m yvector (10); // 10 zero-initialized ints
// assign som e values:
un sig ned sz = m yvector.size();
for (u nsig n ed i=0; i< sz; i+ + )
m yvector.at(i)= i;
cout < < "m yvector contains:";
for (u nsig n ed i=0; i< sz; i+ + )
cout < < ' ' < < m yvector.at(i);
cout < < '\n' ;
// reverse vector using operator[]:
for (u nsig n ed i=0; i< sz/2; i+ + )
{
in t tem p;
tem p = m yvector[sz-1-i];
m yvector[sz-1-i]= m yvector[i];
m yvector[i]= tem p;
}
cout < < "m yvector contains:";
for (u nsig n ed i=0; i< sz; i+ + )
Khai báo vector có 10 phầầ n tưể Lưu kích thước vector
G án giá trị tại vị trí thứ i (tính từ 0) qua phưởng thức at
In giá trị tại vị trí thứ i qua phưởng thức at
Sưể dụng toán tưể [] truy xuầết và gán giá trị phầần tưể cu ểa vector giôếng như m a ểng tĩnh
Trang 15string chooseW ord(const char* fi leN am e)
{
vector< strin g> w ordList; //Khai báo vector chứa các từ sẽ đọc
ifstream fi le(fi leN am e); //Mở tệp có đường dẫn như trong tham số
if (fi le.is_open()) { // Kiểm tra tệp mở thành công
string w ord;
w hile (fi le > > w ord) { //Đọc từng từ (giống cin) đến khi không đọc được nữa
w ordList.p ush_b ack(w ord); //đưa từ vừa đọc vào vector
}
fi le.close();
}
if (w ordList.size() > 0) { // nếu có dữ liệu đọc thành công
int random Index = rand() % w ordList.size();
retu rn w ordList[random Index]; // trả về một từ ngẫu nhiên trong vector
} else retu rn ""; // nếu không đọc được gì, trả về từ rỗng
}
chooseWord (đọc vào vector)
Cẩn thận trường hợp file mở thành công nhưng rỗng
Trang 17Chuẩn hóa dữ liệu
( ==, != ) hoạt động chính xác
Trang 18string chooseW ord(const char* fi leN am e)
{
vector< string> w ordList;
ifstream fi le(fi leN am e);
int random Index = rand() % w ordList.size();
return getLow erC aseString (w ord List[rand om Ind ex]);
} else return "";
chooseWord (chuẩn hóa dữ liệu)
Chuyển từ được chọn sang chữ thường trước khi trả về
Trang 19string chooseW ord(const char* fi leN am e)
{
vector< string> w ordList;
ifstream fi le(fi leN am e);
int random Index = rand() % w ordList.size();
return getLow erC aseString (w ord List[rand om Ind ex]);
} else return "";
}
Chuyển từ sang chữ thường
string getLow erC aseS tring(con st string& s){
string res = s;
int sz = s.size();
for (int i = 0; i < sz; i+ + ) res[i] = tolow er(s[i]);
retu rn res;
}
Trang 20Giới thiệu thư viện algorithm
Trang 21Con trỏ duyệt (Iterator)
s.begin(), s.end()
là khái niệm khái
quát hóa của chỉ
Trang 22Hoàn thành Hangman 2.1
Bài tập: Hangman 2.2 - Chọn tệp dữ liệu
● Từ tham số dòng lệnh
● Từ lựa chọn của người chơi
Trang 24Các phiên bản sau
Bạn có thể tự làm tiếp
2.2 Cho chơi nhiều lần
2.3 Hoạt hình: giá treo cổ lắc lư sau khi thua, nếu thắng thì có một người đứng nhảy múa
Đồ họa? Đợi khi học thư viện đồ họa