Tệp và luồng C ++
Cho đến nay, chúng tôi đã sử dụng iostream thư viện tiêu chuẩn, cung cấp cin và cout phương pháp đọc từ đầu vào tiêu chuẩn và ghi vào đầu ra tiêu chuẩn tương ứng.
Hướng dẫn này sẽ dạy bạn cách đọc và ghi từ một tệp. Điều này yêu cầu một thư viện C ++ tiêu chuẩn khác được gọi làfstream, xác định ba kiểu dữ liệu mới -
Sr.No | Loại dữ liệu & Mô tả |
---|---|
1 | ofstream Kiểu dữ liệu này đại diện cho dòng tệp đầu ra và được sử dụng để tạo tệp và ghi thông tin vào tệp. |
2 | ifstream Kiểu dữ liệu này đại diện cho dòng tệp đầu vào và được sử dụng để đọc thông tin từ tệp. |
3 | fstream Kiểu dữ liệu này đại diện cho dòng tệp nói chung và có các khả năng của cả dòng và ifstream, có nghĩa là nó có thể tạo tệp, ghi thông tin vào tệp và đọc thông tin từ tệp. |
Để thực hiện xử lý tệp trong C ++, các tệp tiêu đề <iostream> và <fstream> phải được bao gồm trong tệp nguồn C ++ của bạn.
Mở tệp
Một tệp phải được mở trước khi bạn có thể đọc hoặc ghi vào tệp. Hoặcofstream hoặc là fstreamđối tượng có thể được sử dụng để mở một tệp để viết. Và đối tượng ifstream được sử dụng để mở tệp chỉ nhằm mục đích đọc.
Sau đây là cú pháp tiêu chuẩn cho hàm open (), là một thành viên của các đối tượng fstream, ifstream và ofstream.
void open(const char *filename, ios::openmode mode);
Ở đây, đối số đầu tiên chỉ định tên và vị trí của tệp sẽ được mở và đối số thứ hai của open() hàm thành viên xác định chế độ mà tệp sẽ được mở.
Sr.No | Cờ chế độ & Mô tả |
---|---|
1 | ios::app Chế độ nối. Tất cả đầu ra cho tệp đó sẽ được nối vào cuối. |
2 | ios::ate Mở tệp cho đầu ra và di chuyển điều khiển đọc / ghi vào cuối tệp. |
3 | ios::in Mở một tệp để đọc. |
4 | ios::out Mở một tệp để viết. |
5 | ios::trunc Nếu tệp đã tồn tại, nội dung của tệp sẽ bị cắt bớt trước khi mở tệp. |
Bạn có thể kết hợp hai hoặc nhiều giá trị này bằng cách ORnhập chúng với nhau. Ví dụ: nếu bạn muốn mở một tệp ở chế độ ghi và muốn cắt bớt tệp đó trong trường hợp tệp đã tồn tại, sau đây sẽ là cú pháp:
ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );
Theo cách tương tự, bạn có thể mở một tệp cho mục đích đọc và ghi như sau:
fstream afile;
afile.open("file.dat", ios::out | ios::in );
Đóng tệp
Khi một chương trình C ++ kết thúc, nó sẽ tự động xóa tất cả các luồng, giải phóng tất cả bộ nhớ được cấp phát và đóng tất cả các tệp đã mở. Nhưng thông lệ tốt là lập trình viên nên đóng tất cả các tệp đã mở trước khi kết thúc chương trình.
Sau đây là cú pháp tiêu chuẩn cho hàm close (), là một thành viên của các đối tượng fstream, ifstream và ofstream.
void close();
Ghi vào tệp
Trong khi lập trình C ++, bạn ghi thông tin vào một tệp từ chương trình của mình bằng toán tử chèn luồng (<<) giống như khi bạn sử dụng toán tử đó để xuất thông tin ra màn hình. Sự khác biệt duy nhất là bạn sử dụng mộtofstream hoặc là fstream đối tượng thay vì cout vật.
Đọc từ một tệp
Bạn đọc thông tin từ một tệp vào chương trình của mình bằng toán tử trích xuất luồng (>>) giống như bạn sử dụng toán tử đó để nhập thông tin từ bàn phím. Sự khác biệt duy nhất là bạn sử dụng mộtifstream hoặc là fstream đối tượng thay vì cin vật.
Đọc và Viết Ví dụ
Sau đây là chương trình C ++ mở một tệp ở chế độ đọc và ghi. Sau khi ghi thông tin do người dùng nhập vào tệp có tên afile.dat, chương trình đọc thông tin từ tệp và xuất ra màn hình -
#include <fstream>
#include <iostream>
using namespace std;
int main () {
char data[100];
// open a file in write mode.
ofstream outfile;
outfile.open("afile.dat");
cout << "Writing to the file" << endl;
cout << "Enter your name: ";
cin.getline(data, 100);
// write inputted data into the file.
outfile << data << endl;
cout << "Enter your age: ";
cin >> data;
cin.ignore();
// again write inputted data into the file.
outfile << data << endl;
// close the opened file.
outfile.close();
// open a file in read mode.
ifstream infile;
infile.open("afile.dat");
cout << "Reading from the file" << endl;
infile >> data;
// write the data at the screen.
cout << data << endl;
// again read the data from the file and display it.
infile >> data;
cout << data << endl;
// close the opened file.
infile.close();
return 0;
}
Khi mã trên được biên dịch và thực thi, nó tạo ra đầu vào và đầu ra mẫu sau:
$./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9
Các ví dụ trên sử dụng các hàm bổ sung từ đối tượng cin, như hàm getline () để đọc dòng từ bên ngoài và hàm ignore () để bỏ qua các ký tự thừa còn lại của câu lệnh đọc trước đó.
Con trỏ vị trí tệp
Cả hai istream và ostreamcung cấp các chức năng thành viên để định vị lại con trỏ vị trí tệp. Các chức năng thành viên này làseekg ("seek get") cho istream và seekp ("seek put") cho ostream.
Đối số của seekg và seekp thông thường là một số nguyên dài. Đối số thứ hai có thể được chỉ định để chỉ ra hướng tìm kiếm. Hướng tìm kiếm có thể làios::beg (mặc định) để định vị liên quan đến đầu luồng, ios::cur để định vị so với vị trí hiện tại trong luồng hoặc ios::end để định vị liên quan đến cuối luồng.
Con trỏ vị trí tệp là một giá trị số nguyên chỉ định vị trí trong tệp dưới dạng một số byte từ vị trí bắt đầu của tệp. Một số ví dụ về định vị con trỏ vị trí tệp "get" là:
// position to the nth byte of fileObject (assumes ios::beg)
fileObject.seekg( n );
// position n bytes forward in fileObject
fileObject.seekg( n, ios::cur );
// position n bytes back from end of fileObject
fileObject.seekg( n, ios::end );
// position at end of fileObject
fileObject.seekg( 0, ios::end );