2010-03-04 38 views

Trả lời

7

Bạn có thể ghi đè operator>>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 readwrite 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ì >>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.

0

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.

4

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 

myFile>>myObject 

với tăng serialization.

1

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.

3

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.

0

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 ...

Các vấn đề liên quan