Tôi có một đối tượng có nhiều chuỗi văn bản làm thành viên. Tôi muốn viết đối tượng này vào tập tin cùng một lúc, thay vì viết từng chuỗi vào tập tin. Làm thế nào tôi có thể làm điều đó?Cách viết một đối tượng vào tập tin trong C++
Trả lời
Bạn có thể ghi đè operator>>
và operator<<
để đọc/ghi luồng.
Ví dụ Entry struct
với một số giá trị:
struct Entry2
{
string original;
string currency;
Entry2() {}
Entry2(string& in);
Entry2(string& original, string& currency)
: original(original), currency(currency)
{}
};
istream& operator>>(istream& is, Entry2& en);
ostream& operator<<(ostream& os, const Entry2& en);
Thực hiện:
using namespace std;
istream& operator>>(istream& is, Entry2& en)
{
is >> en.original;
is >> en.currency;
return is;
}
ostream& operator<<(ostream& os, const Entry2& en)
{
os << en.original << " " << en.currency;
return os;
}
Sau đó, bạn FileStream mở, và đối với từng đối tượng bạn gọi:
ifstream in(filename.c_str());
Entry2 e;
in >> e;
//if you want to use read:
//in.read(reinterpret_cast<const char*>(&e),sizeof(e));
in.close();
Hoặc đầu ra:
Entry2 e;
// set values in e
ofstream out(filename.c_str());
out << e;
out.close();
Hoặc nếu bạn muốn sử dụng luồng read
và write
thì bạn chỉ cần thay thế mã có liên quan trong việc thực hiện operator
s.
Khi các biến là riêng tư bên trong cấu trúc/lớp của bạn thì bạn cần khai báo operator
s làm phương pháp kết bạn.
Bạn triển khai bất kỳ định dạng/dấu phân tách nào bạn muốn. Khi chuỗi của bạn bao gồm dấu cách, hãy sử dụng getline() lấy chuỗi và luồng thay vì >>
vì operator>>
sử dụng dấu cách làm dấu phân cách theo mặc định. Phụ thuộc vào dấu phân cách của bạn.
Thật không may là nói chung không hoàn toàn có thể. Nếu cấu trúc của bạn chỉ chứa dữ liệu thuần túy (không có con trỏ hoặc đối tượng phức tạp), bạn có thể lưu nó dưới dạng một đoạn, nhưng phải cẩn thận nếu tính di động là một vấn đề. Sự cố đệm, kích thước loại dữ liệu và các vấn đề về endianess làm cho vấn đề này trở nên rắc rối.
Bạn có thể sử dụng Boost.Serialization để giảm thiểu số lượng mã cần thiết cho việc searialization di động và phiên bản thích hợp.
Không thực sự đơn giản, đó là C++ sau tất cả, không phải PHP, hoặc JavaScript.
http://www.parashift.com/c++-faq-lite/serialization.html
Boost cũng có một số thư viện cho nó: http://www.boost.org/doc/libs/release/libs/serialization ... như Tronic đã đề cập :)
Nó được gọi là serialization. Có rất nhiều chủ đề tuần tự hóa trên SO.
Ngoài ra còn có thư viện tuần tự hóa đẹp được bao gồm trong tăng cường.
http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/index.html
về cơ bản bạn có thể làm
myFile<<myObject
và
myFile>>myObject
với tăng serialization.
Phương pháp tốt hơn là viết từng trường riêng lẻ cùng với độ dài chuỗi.
Để thay thế, bạn có thể tạo một mảng char
(hoặc std::vector<char>
) và viết tất cả các thành viên vào bộ đệm, sau đó ghi bộ đệm vào đầu ra.
Thorn cơ bản là trình biên dịch được phép chèn đệm giữa các thành viên trong một lớp hoặc cấu trúc. Sử dụng memcpy
hoặc std::copy
sẽ dẫn đến byte đệm được ghi vào đầu ra.
Chỉ cần nhớ rằng bạn cần phải ghi độ dài chuỗi và nội dung hoặc nội dung theo sau bởi một số ký tự kết thúc.
Những người khác sẽ đề xuất kiểm tra thư viện Boost Serialization.
Nếu bạn có:
struct A {
char a[30], b[25], c[15];
int x;
}
sau đó bạn có thể viết nó tất cả chỉ với write (fh, ptr, sizeof (struct a)).
Tất nhiên, đây không phải là di động (vì chúng tôi không lưu endieness hoặc kích thước của "int", nhưng điều đó có thể không phải là một vấn đề cho bạn.
Nếu bạn có:
struct A {
char *a, *b, *c;
int d;
}
sau đó bạn không tìm cách để viết các đối tượng; bạn đang tìm kiếm để sắp xếp nó. Đặt cược tốt nhất của bạn là tìm kiếm trong các thư viện Boost và sử dụng các thường trình tuần tự hóa của chúng, bởi vì nó không phải là một vấn đề dễ dàng trong các ngôn ngữ mà không có sự phản ánh.
Giả sử mục tiêu của bạn như đã nêu, để viết đối tượng với một cuộc gọi duy nhất để viết() hoặc fwrite() hoặc bất cứ điều gì, trước tiên bạn cần sao chép chuỗi và dữ liệu đối tượng khác vào một khối liền kề duy nhất ký ức. Sau đó, bạn có thể viết() rằng khối bộ nhớ ra với một cuộc gọi duy nhất. Hoặc bạn có thể thực hiện một vector-write bằng cách gọi writev(), nếu cuộc gọi đó có sẵn trên nền tảng của bạn.
Điều đó nói rằng, bạn có thể sẽ không đạt được nhiều bằng cách giảm số lượng cuộc gọi viết. Đặc biệt là nếu bạn đang sử dụng fwrite() hoặc tương tự đã có, thì thư viện C đã làm đệm cho bạn, do đó, chi phí của nhiều cuộc gọi nhỏ là tối thiểu anyway. Đừng đặt mình qua rất nhiều nỗi đau và mã phức tạp, trừ khi nó thực sự sẽ làm tốt ...
- 1. viết mảng 2ngày vào một tập tin trong C
- 2. Viết Struct vào một tập tin trong c
- 3. Viết xmlwriter vào tập tin
- 4. Viết một mảng NSData vào tập tin
- 5. Viết dòng vào một tập tin bằng C
- 6. Nodejs viết json vào một tập tin
- 7. viết một BitSet vào một tập tin trong java
- 8. Viết vào tập tin (Prolog)
- 9. Viết TẤT CẢ chương trình đầu ra vào một tập tin txt trong C++
- 10. Cách viết các giá trị vector vào một tập tin
- 11. Groovy viết ra danh sách vào một tập tin
- 12. Viết vào một tập tin XML trong Java
- 13. Cách viết đối tượng S3 vào một tệp?
- 14. viết một tập tin rdata từ
- 15. python, viết Json vào tập tin
- 16. Batch file - Viết danh sách các tập tin vào biến
- 17. Viết một số nguyên vào một tập tin có fputs()
- 18. Python Viết byte vào tập tin
- 19. Viết một tập tin .htaccess trong PHP?
- 20. Viết nhật ký vào tập tin
- 21. Viết tập tin lớn
- 22. Truyền tập tin từ xa vào các đối tượng tập tin
- 23. là đối tượng tập tin trong python một iterable
- 24. Viết con trỏ đến tập tin trong C
- 25. Viết số vào một tập tin văn bản - tập tin batch
- 26. Tạo và viết các dòng vào một tập tin
- 27. Chữ viết Python (iPhone) Biểu tượng cảm xúc vào một tập tin
- 28. cách nạp một tập tin vào telnet
- 29. Viết một đệm nhị phân vào một tập tin trong python
- 30. Ghi vào một luồng như thể nó là một tập tin, nhưng thực sự ghi vào một đối tượng