Tệp và Luồng trong C++
Chào, các nhà lập trình tương lai! Hôm nay, chúng ta sẽ bắt đầu hành trình hấp dẫn vào thế giới tệp và luồng trong C++. Là người giáo viên khoa học máy tính nhân viên bạn, tôi đến đây để hướng dẫn bạn trong cuộc phiêu lưu này. Hãy tin tôi, bằng khi kết thúc bài học này, bạn sẽ xử lý tệp như một chuyên gia!
Mở Tệp
Hãy bắt đầu với những điều cơ bản. Hãy tưởng tượng bạn có một chiếc hộp kho báu (đó là tệp của chúng ta) và bạn cần mở nó để đặt điều gì đó vào hoặc lấy điều gì đó ra. Trong C++, chúng ta sử dụng một thứ gọi là "luồng" để tương tác với tệp.
Để mở một tệp, chúng ta sử dụng lớp ifstream
để đọc (input) và lớp ofstream
để ghi (output). Nếu bạn muốn làm cả hai, bạn có thể sử dụng lớp fstream
.
Dưới đây là cách bạn mở một tệp:
#include <fstream>
#include <iostream>
using namespace std;
int main() {
ofstream myFile("treasure.txt");
if (myFile.is_open()) {
cout << "Hộp kho báu đã mở!" << endl;
} else {
cout << "Ôi không! Chúng ta không thể mở hộp kho báu." << endl;
}
return 0;
}
Trong ví dụ này, chúng ta đang cố gắng mở một tệp có tên "treasure.txt" để ghi. Hàm is_open()
kiểm tra xem tệp có được mở thành công hay không.
Đóng Tệp
Sau khi hoàn thành với hộp kho báu của mình, điềuPolite (và là thực hành tốt) là đóng nó. Trong C++, các tệp được tự động đóng khi đối tượng luồng tệp ra khỏi phạm vi, nhưng điều tốt nhất là đóng chúng một cách rõ ràng:
myFile.close();
Ghi vào Tệp
Bây giờ khi chúng ta đã mở hộp kho báu, hãy đặt một số kho báu vào nó! Việc ghi vào tệp rất dễ dàng như sử dụng toán tử <<
:
ofstream myFile("treasure.txt");
if (myFile.is_open()) {
myFile << "Gold coins: 100" << endl;
myFile << "Magic wands: 3" << endl;
myFile << "Dragon eggs: 1" << endl;
cout << "Kho báu đã được thêm vào hộp!" << endl;
} else {
cout << "Không thể mở hộp kho báu." << endl;
}
myFile.close();
Trong ví dụ này, chúng ta đang ghi ba dòng vào tệp của mình. Mỗi toán tử <<
ghi đoạn văn bản theo đó vào tệp, và endl
thêm một dòng mới.
Đọc từ Tệp
Đọc từ tệp giống như là lập danh sách hàng của hộp kho báu của chúng ta. Chúng ta sử dụng lớp ifstream
và toán tử >>
để đọc từ tệp:
#include <string>
ifstream myFile("treasure.txt");
string line;
if (myFile.is_open()) {
while (getline(myFile, line)) {
cout << line << endl;
}
myFile.close();
} else {
cout << "Không thể mở hộp kho báu." << endl;
}
Ở đây, chúng ta sử dụng getline()
để đọc mỗi dòng từ tệp và in nó ra console. Vòng lặp while
tiếp tục cho đến khi chúng ta đến cuối tệp.
Ví dụ Đọc và Ghi
Hãy kết hợp đọc và ghi trong một ví dụ phức tạp hơn. Chúng ta sẽ tạo một chương trình quản lý kho hàng của chúng ta:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main() {
// Ghi vào tệp
ofstream outFile("inventory.txt");
if (outFile.is_open()) {
outFile << "Gold coins: 100" << endl;
outFile << "Magic wands: 3" << endl;
outFile << "Dragon eggs: 1" << endl;
outFile.close();
cout << "Kho hàng đã được lưu!" << endl;
} else {
cout << "Không thể lưu kho hàng." << endl;
return 1;
}
// Đọc từ tệp
ifstream inFile("inventory.txt");
string item;
int count;
if (inFile.is_open()) {
cout << "Kho hàng hiện tại:" << endl;
while (inFile >> item >> count) {
cout << item << " " << count << endl;
}
inFile.close();
} else {
cout << "Không thể đọc kho hàng." << endl;
return 1;
}
return 0;
}
Trong ví dụ này, chúng ta trước tiên ghi kho hàng của mình vào tệp, sau đó đọc nó lại và hiển thị. Nhận thấy rằng chúng ta sử dụng >>
để đọc từng từ và số riêng biệt.
Con Trỏ Vị Trí Tệp
Hãy tưởng tượng bạn đang đọc một cuốn sách và bạn muốn theo dõi vị trí hiện tại của mình. Con trỏ vị trí tệp làm điều đó cho các tệp. Chúng giữ track vị trí hiện tại của chúng ta trong tệp.
Dưới đây là một số hàm hữu ích cho việc làm việc với con trỏ vị trí tệp:
Function | Mô tả |
---|---|
tellg() |
Trả về vị trí hiện tại của con trỏ get (cho input) |
tellp() |
Trả về vị trí hiện tại của con trỏ put (cho output) |
seekg() |
Đặt vị trí của con trỏ get |
seekp() |
Đặt vị trí của con trỏ put |
Hãy xem một ví dụ:
#include <fstream>
#include <iostream>
using namespace std;
int main() {
fstream file("treasure_map.txt", ios::in | ios::out);
if (!file.is_open()) {
cout << "Không thể mở bản đồ kho báu!" << endl;
return 1;
}
// Ghi vào tệp
file << "X làm dấu chỗ!";
// Di chuyển đến đầu tệp
file.seekg(0, ios::beg);
// Đọc nội dung
string content;
getline(file, content);
cout << "Bản đồ nói: " << content << endl;
// Di chuyển 2 ký tự từ đầu
file.seekp(2, ios::beg);
// Ghi đè một phần nội dung
file << "không luôn làm dấu";
// Di chuyển đến đầu và đọc lại
file.seekg(0, ios::beg);
getline(file, content);
cout << "Bây giờ bản đồ nói: " << content << endl;
file.close();
return 0;
}
Trong ví dụ này, chúng ta đang ghi vào một tệp, sau đó đọc từ nó, sau đó sửa đổi một phần nội dung của nó và cuối cùng đọc lại. Như thế này, chúng ta đang cập nhật bản đồ kho báu của mình!
Và thế là, các nhà khám phá dũng cảm của vùng C++! Bạn đã học cách mở hộp kho báu (tệp), lưu kho báu của bạn (dữ liệu ghi), lập danh sách hàng (dữ liệu đọc), và thậm chí cập nhật bản đồ kho báu của bạn (thay đổi nội dung tệp). Hãy nhớ, luyện tập sẽ làm bạn hoàn hảo, vì vậy hãy tiếp tục lập trình và khám phá. Ai biết những kho báu số của bạn sẽ khám phá ra sao tiếp theo? Chúc bạn có một ngày编程!
Credits: Image by storyset