2009-02-27 17 views
7

C++ içindeki bir yapının içeriğini bir metin dosyasına yazmak nasıl yapılır? Yapmak istediğim şey, A isimli bir yapıya sahip olduğumu söylemek, veri üyeleri A.one, A.two ve benzerleri ile, ve bunları bir satır içine bir satır halinde yazmak istiyorum, örneğinC++ yapılarının bir metin dosyasına dökülmesi

Yapısı bir
A.one = değer
A.two = değer ...
B.one = değer
B.two = değer

Temelde ben yapmak istiyorum

Yapısı B Bir dökümü .. Bunu yapmak için kolay bir yolu var mı? Bunun için en iyi G/Ç yöntemi nedir? CFile? iostream? Teşekkürler .. Bir sınıfın üye verilerin tüm değerlerini dökmek için daha kolay bir yolu var mı?


DÜZENLEME: Kahretsin, teşekkürler çocuklar ..

+0

İlgili: * [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/how-do-you-serialize-an-object-in-c) – dmckee

cevap

8

C++ No yansıma, siz (simplicty için, iostream kullanarak) örneğin elle yapmak zorunda:

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++ içedönük değil. Yani, yapılarının içeriği hakkında hiçbir şey bilmiyor. Bunu yapmak için bir çeşit manuel not veya yansıma sistemi kullanmalısınız.

Elbette, yapılarla ilgili kodlama bilgisiyle sorun yaşarsanız, bilgileri herhangi bir G/Ç yöntemiyle boşaltabilirsiniz. Örneğin

: Bu yapının bilgilerine ihtiyaç duyar, ve yapı değiştirilirse otomatik olarak güncellenir olmayacak çünkü bu sıkıcı görebileceğiniz gibi

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); 
} 

. Ama bu "düzgün" yi yapmak için bir yansıtma sisteminin yükü, özellikle de öğreniyorsanız, bir dezavantaj olabilir.

+0

Belki de C++ standart I/O sınıflarının kullanımı burada daha güvenli olurdu? Üye1 ve üye2 türleri değiştirilecekse, kodunuz yanlış çalışacaktır. – okutane

+0

Tercihe göre C++ akışı IO kullanmıyorum. Bu durumda, marjinal olarak daha güvenli olacağını haklısınız, ancak buradaki kod, tercih ettiğiniz hangi IO şemasından bağımsız olarak, yapı tanımına sahip olmak için kilitlemede dikkatli bir güncelleme gerektirmesidir. –

0

Bu C++ C'den daha geçerlidir, ama unutmayın ki yazdığınız takdirde bu doğrudan bir yapıya (veya bir ağ arabelleğine) bir yapı, sonuç makine ve derleyici bağımlı olacaktır. Tamsayılar, bayt sırası ile yazılacak ve struct için derleyici dolgu baytları da eklenecektir. Farklı bir endianness veya farklı derleyici yönergeleri olan bir makinede arabelleği okumaya çalışmak,

Çalışmayacak gibi bir şeyle olur (sözdiziminde affedin): write (f, & A, sizeof (A));

0

, YOK sanal metotlar ve YOK işaretçileri:

İşte öğretici bir bağlantıdır Daha sonra kısa süreli kludge olarak sadece kullanabilirsiniz:

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

Ancak, bunun aynı platformda çapraz platform veya çapraz derleyici revizyonları olmasını beklemeyin.

I think I've discussed this before...

+0

fd, write (fd, ....) içinde ne anlama geliyor? dosya tanıtıcı mı? içinde bazı işaretçiler var .. =/ – krebstar

+0

fd == dosya tanıtıcısı, open() öğesinden elde edildiği gibi. Eğer bir DOSYA * kullanıyorsanız (fopen'den), fwrite() kullanabilirsiniz. –

İlgili konular