2009-02-27 36 views
7

làm cách nào để viết nội dung của cấu trúc trong C++ thành tệp văn bản? Điều tôi muốn làm là nói rằng tôi có cấu trúc được gọi là A, với các thành viên dữ liệu A.one, A.two, v.v. và tôi muốn viết chúng ra từng dòng thành một tệp văn bản, như vậybán cấu trúc C++ vào một tệp văn bản

cấu trúc Một
A.one = giá trị
A.two = giá trị ...

cấu trúc B
B.one = giá trị
B.two = giá trị

Về cơ bản tôi muốn làm một bãi chứa .. Có cách nào dễ dàng để thực hiện việc này không? Phương pháp I/O tốt nhất cho việc này là gì? CFile? iostream? Cảm ơn .. Có cách nào dễ dàng hơn để đổ tất cả các giá trị của dữ liệu thành viên của một lớp không?


EDIT: Crap, nhờ guys ..

+0

liên quan: * [http://stackoverflow.com/questions/234724/how-to-serialize-in-c](http://stackoverflow.com/questions/234724/how-to -serialize-in-c) * [http://stackoverflow.com/questions/523872/how-do-you-serialize-an-object-in-c](http://stackoverflow.com/questions/523872/Làm thế nào-do-bạn-serialize-an-đối tượng-in-c) – dmckee

Trả lời

8

Không phản ánh trong C++, vì vậy bạn phải làm điều đó bằng tay, ví dụ (dùng iostream, cho simplicty):

dump_A(std::cout, "A", a); 

void dump_A(std::iostream& os, const char* name, A const& a) 
{ 
    os << "Structure " << name << '\n' 
     << name << ".one = " << a.one << '\n' 
     << name << ".two = " << a.two << '\n'; 
} 
5

C++ không phải là nội tâm. Đó là, nó không biết gì về nội dung của cấu trúc của nó. Bạn phải sử dụng một số loại chú thích thủ công hoặc hệ thống phản chiếu để thực hiện việc này.

Tất nhiên, nếu bạn đồng ý với thông tin mã hóa cứng về cấu trúc, bạn có thể đổ thông tin bằng bất kỳ phương thức I/O nào.

Ví dụ:

struct A 
{ 
    int member1; 
    char member2; 
}; 

void PrintA (const A& a) 
{ 
    std::printf ("member1: %d\n", a.member1); 
    std::printf ("member2: %c\n", b.member2); 
} 

Như bạn có thể thấy điều này là tẻ nhạt vì nó đòi hỏi kiến ​​thức sâu sắc về cấu trúc, và sẽ không được cập nhật tự động nếu cấu trúc bị thay đổi. Nhưng chi phí của một hệ thống phản chiếu để làm điều này "đúng" có thể là một bất lợi, đặc biệt là nếu bạn đang học.

+0

Có thể sử dụng các lớp I/O standart C++ sẽ an toàn hơn ở đây? Nếu các loại member1 và member2 sẽ được thay đổi thì mã của bạn sẽ hoạt động không chính xác. – okutane

+0

Tôi không sử dụng dòng C++ IO như một vấn đề ưu tiên. Bạn nói đúng rằng nó sẽ an toàn hơn một chút trong trường hợp này, nhưng vấn đề là mã yêu cầu cập nhật cẩn thận để giữ nguyên với định nghĩa struct, điều này đúng bất kể sơ đồ IO bạn thích. –

0

này áp dụng hơn đối với C hơn so với C++, nhưng hãy nhớ rằng nếu bạn viết một cấu trúc trực tiếp vào tập tin (hoặc một bộ đệm mạng) sau đó kết quả sẽ được máy và trình biên dịch phụ thuộc. Số nguyên sẽ được viết theo thứ tự byte của máy chủ và byte đệm biên dịch cho cấu trúc cũng sẽ được bao gồm. Cố gắng đọc bộ đệm trên máy có độ dài khác nhau hoặc chỉ thị trình biên dịch khác nhau sẽ không hoạt động

Điều này xảy ra với một cái gì đó như (được tha thứ theo cú pháp): write (f, & A, sizeof (A));

0

NẾU đây chỉ là một struct, một đồng bằng cũ kiểu dữ liệu C-tương thích, với NO phương pháp ảoNO con trỏ, sau đó như một kludge ngắn hạn bạn chỉ có thể sử dụng:

struct Foo { int a, b; char c, d, e[50]; } f; 
write(fd, & f, sizeof(f)); 

Tuy nhiên, đừng mong đợi điều này là nền tảng chéo, hoặc thậm chí các phiên bản biên dịch chéo trên cùng một nền tảng.

I think I've discussed this before...

+0

fd có nghĩa là gì khi viết (fd, ....)? là tập tin xử lý? nó có một số con trỏ trong nó .. =/ – krebstar

+0

fd == mô tả tập tin, như thu được từ mở(). Nếu bạn đang sử dụng một FILE * (từ fopen), bạn có thể sử dụng hàm fwrite(). –

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