Xử lý tệp cho phép chúng tôi lưu trữ đầu vào của người dùng trong một tệp để ngay cả sau khi chương trình bị chấm dứt, dữ liệu do người dùng nhập không bị xóa hoặc xóa. Như xảy ra trong một chương trình đơn giản, chúng tôi truy cập dữ liệu đó bằng cách thực thi lại chương trình, nó hoạt động giống như một ứng dụng trong thế giới thực.
Tại đây bạn có thể lưu trữ đầu vào của người dùng trong một tệp theo hai cách, bạn có thể gọi nó là định dạng dữ liệu.
Chúng ta sẽ hiểu hai điều này với một số ví dụ –
Ở đây chúng ta sẽ thảo luận về định dạng văn bản và định dạng nhị phân trong C ++,
- Định dạng văn bản/chế độ ký tự
- Định dạng nhị phân
Ở đây chúng ta sẽ hiểu các định dạng này từ sự khác biệt giữa hai định dạng này.
Nó có định dạng văn bản theo mặc định.
Nói chung, đây là hai cách để lưu trữ dữ liệu ở định dạng văn bản –
- Toán tử chèn (<<) để viết, toán tử trích xuất (>>) để đọc
put()
để viết, để đọcget()
Dưới đây là một ví dụ về định dạng văn bản dưới đây –
#include<iostream>
#include<stdio.h> // gets()
#include<fstream>
using namespace std;
int main()
{
char *name;
ofstream fout;
cout<<"Enter Your Name :";
gets(name);
cout<<"Name: "<<name;// displaying on monitor
fout.open("text.txt");
fout<<name;//writing in file
fout.close();
return 0;
}
RA
Enter Your Name : rahul singh
Name: rahul singh
Đối với định dạng nhị phân và , là các hàm được xác định trước, được sử dụng –write()
read()
Đây là chương trình,
#include<iostream>
#include<stdio.h>
#include<fstream>
using namespace std;
int main()
{
char *name;
ofstream fout;
cout<<"Enter Your Name :";
gets(name);
cout<<"Name: "<<name; //displaying on monitor
fout.open("binary.txt",ios::binary);
fout.write((char*)&name,sizeof(name));//writing in file
fout.close();
return 0;
}
RA
Enter Your Name : rahul singh
Name: rahul singh
Lưu ý ở đây rằng txt là một phần mở rộng tệp trong cả hai chương trình trong khi định dạng của dữ liệu được lưu trữ trong đó sẽ khác nhau (văn bản / nhị phân).
Nếu sử dụng ios :: nhị phân với << chẳng hạn như,
fout.open("text.txt",ios::binary);
fout<<name;
Thậm chí sau đó nó sẽ lưu trữ dữ liệu ở định dạng văn bản.
Và nếu chúng ta không sử dụng với như,ios :: binary
write()
fout.open("binary.txt");
fout.write((char*)&name,sizeof(name));
Vì vậy, nó sẽ lưu trữ các bản ghi ở định dạng nhị phân chỉ tối đa một giới hạn, vì vậy chức năng với ios::binary là bắt buộc đối với định dạng nhị phân.write()
Một ví dụ về điều này được đưa ra ở cuối trang.
- Ở dạng ký tự, hình thức mà người dùng nhập dữ liệu được lưu trữ trong tệp ở cùng một dạng.
Giả sử người dùng lưu trữ một tên như “rahul singh“, thì nó sẽ được lưu trữ trong tệp như sau – - Ở dạng nhị phân, dữ liệu do người dùng nhập được lưu trữ trong tệp ở dạng nhị phân. Giả sử người dùng lưu trữ một tên, thì nó sẽ được lưu trữ trong tệp như sau –
- lưu trữ dữ liệu ở dạng văn bản chiếm nhiều bộ nhớ hơn so với lưu trữ dữ liệu ở dạng nhị phân – Giống như tên “rahul Singh” từng được lưu trữ ở định dạng văn bản-
Bởi vì chúng ta biết rằng kích thước bộ nhớ của ký tự là 1 byte, vì vậy 1 byte cho mỗi ký tự (nút dấu cách cũng sẽ lấy 1 byte) như,
Và bây giờ cùng một tên “rahul Singh” hiện được lưu trữ ở dạng nhị phân.
Đây là sơ đồ
Vì kích thước bộ nhớ là 2 byte, do đó,int
Bây giờ bạn có thể thấy khi chúng tôi lưu trữ cùng một dữ liệu, đầu tiên ở định dạng văn bản, nó mất 11 byte trong khi lưu trữ ở dạng nhị phân, chỉ mất 2 byte.
- Vì kích thước của dữ liệu lưu trữ ở dạng ký tự lớn hơn kích thước của dữ liệu lưu trữ ở dạng nhị phân. Do đó, dữ liệu được lưu trữ ở dạng nhị phân được truy cập nhanh hơn dữ liệu được lưu trữ ở dạng văn bản.
Giả sử nếu người dùng lưu trữ tên “rahul singh“, Tệp dữ liệu được lưu trữ ở định dạng nhị phân được chuyển đổi thành nhị phân hoặc một số ký tự đặc biệt mà con người không thể đọc được.
Bởi vì dữ liệu được lưu trữ ở định dạng văn bản có thể được đọc từ mặt sau ngay cả khi không có chương trình làm giảm tính bảo mật.
Bây giờ chúng ta biết rằng dữ liệu được lưu trữ ở dạng nhị phân an toàn hơn và nhanh hơn dạng ký tự.
Nhưng lưu trữ dữ liệu ở dạng ký tự cũng có một lợi thế, chẳng hạn như in bảng điểm của học sinh, in biên lai hóa đơn, v.v. Chúng tôi sử dụng hình thức ký tự để thực hiện các nhiệm vụ như vậy.
Hãy hiểu điều này với một ví dụ,
Giả sử một chương trình là “Hệ thống quản lý sinh viên” lưu trữ tất cả các hồ sơ của sinh viên. Trong đó, chúng tôi đã lưu trữ dữ liệu ở dạng nhị phân. Nhưng nếu có một tùy chọn để in bảng điểm của học sinh thì đó có thể là một chương trình tốt hơn. Vì vậy, đối với nhiệm vụ này, chúng ta có thể sử dụng dạng ký tự.
Sử dụng dạng ký tự, chúng tôi đã in một số bảng đánh dấu ở đây.
Không nhất thiết là chúng ta chỉ có thể sử dụng dạng ký tự để in bảng điểm học sinh. Nó cũng là một lựa chọn tốt hơn cho tất cả những ai cần một đầu ra vật lý.
Phụ
Để lưu trữ dữ liệu ở định dạng nhị phân, chúng tôi sử dụng cú pháp sau –
Nhưng ở đây chúng tôi chưa sử dụng ios :: nhị phân nhưng nó vẫn lưu trữ dữ liệu ở định dạng nhị phân
Điều này có nghĩa là chúng tôi đang lưu trữ dữ liệu ở định dạng nhị phân theo hai cách.
ofstream fout;
fout.open("binary.txt");// here ios::binary not used
fout.write((char*)&name,sizeof(name));
fout.close();
Ở đây chúng ta chưa sử dụng, tuy nhiên nó sẽ lưu trữ dữ liệu ở dạng nhị phân.ios::binary
Ý nghĩa trong trường hợp đầu tiên
fout.open("binary.txt")
fout.write((char*)&name,sizeof(name));
Và trong trường hợp thứ hai
fout.open("binary.txt",ios::binary)
fout.write((char*)&name,sizeof(name));
Cả hai sẽ lưu trữ dữ liệu ở định dạng nhị phân.
Bởi vì hàm tự động lưu trữ dữ liệu ở định dạng nhị phân. Nhưng bây giờ câu hỏi đặt ra là liệu chế độ nhị phân có phải là tùy chọn hay không? Câu trả lời là Không.write()
Vậy tại sao nó không được sử dụng trong trường hợp đầu tiên. Điều này là do bắt buộc khi chúng tôi lưu trữ một dữ liệu số khối lượng lớn.ios::binary
Hãy hiểu điều này với các chương trình dưới đây,
Ở đây cả hai chương trình dưới đây thực thi lần thứ 15 (có nghĩa là chúng tôi viết một tệp duy nhất lần thứ 15) vì chúng tôi đã nói rằng bắt buộc khi chúng tôi lưu trữ dữ liệu số khối lượng lớn.ios::binary
- Không có IOS::Chế độ nhị phân
#include<iostream>
#include<fstream>
using namespace std;
class example
{
public:
int number;
void write();
void read();
};
example obj; // object created
void example:: write(void)
{
ofstream fout;
cout<<"Press any key to write file:";
fout.open("myfile.txt",ios::app);
fout.write((char*)&obj,sizeof(example));
fout.close();
}
void example::read(void)
{
ifstream fin;
fin.open("myfile.txt");
while(fin.read((char*)&obj,sizeof(example)))
{
cout<<number<<endl;
}
fin.close();
}
//main program start here
int main()
{
//write a file 15th time
obj.number=1; obj.write();
obj.number=2; obj.write();
obj.number=3; obj.write();
obj.number=4; obj.write();
obj.number=5; obj.write();
obj.number=6; obj.write();
obj.number=7; obj.write();
obj.number=8; obj.write();
obj.number=9; obj.write();
obj.number=10; obj.write();
obj.number=11; obj.write();
obj.number=12; obj.write();
obj.number=13; obj.write();
obj.number=14; obj.write();
obj.number=15; obj.write();
obj.read(); //displaying file content
return 0;
}
OUTPUT
Press any key to continue
1
2
3
4
5
6
7
8
9
10
11
12
13
9083
5432
32159
now we can see above output we store number 1-15 but its not happen and print garbage value after number 13-15, now we will perform same task using mode.ios::binary
- with mode
ios::binary
#include<iostream>
#include<fstream>
using namespace std;
class example
{
public:
int number;
void write();
void read();
};
example obj; // object created
void example:: write(void)
{
ofstream fout;
cout<<"Press any key to write file:";
fout.open("myfile.txt",ios::binary|ios::app);
fout.write((char*)&obj,sizeof(example));
fout.close();
}
void example::read(void)
{
ifstream fin;
fin.open("myfile.txt",ios::binary);
while(fin.read((char*)&obj,sizeof(example)))
{
cout<<number<<endl;
}
fin.close();
}
//main program start here
int main()
{
//write a file 15th time
obj.number=1; obj.write();
obj.number=2; obj.write();
obj.number=3; obj.write();
obj.number=4; obj.write();
obj.number=5; obj.write();
obj.number=6; obj.write();
obj.number=7; obj.write();
obj.number=8; obj.write();
obj.number=9; obj.write();
obj.number=10; obj.write();
obj.number=11; obj.write();
obj.number=12; obj.write();
obj.number=13; obj.write();
obj.number=14; obj.write();
obj.number=15; obj.write();
obj.read(); //displaying file content
return 0;
}
OUTPUT
Press any key to continue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Trong đầu ra ở trên bằng cách sử dụng chế độ nhị phân, lưu trữ tệp hoàn chỉnh, ghi lại và cho đầu ra đúng.
Khái niệm xử lý tệp rất nhạy cảm vì các loại dữ liệu có thể lấy bộ nhớ khác nhau trong một hệ thống khác. Nhưng kích thước của định dạng văn bản sẽ luôn lớn hơn định dạng nhị phân.
Nếu một dữ liệu khối lượng lớn thuộc các loại số, thì sẽ là bắt buộc trong khi nó sẽ là tùy chọn đối với dữ liệu có định dạng văn bản.ios::binary