Mam obiekt z kilkoma łańcuchami tekstowymi jako członkami. Chcę zapisać ten obiekt do pliku naraz, zamiast zapisywać każdy ciąg do pliku. Jak mogę to zrobić?Jak napisać obiekt do pliku w C++
Odpowiedz
Można zastąpić operator>>
i operator<<
do odczytu/zapisu do strumienia.
Przykład Entry struct
z pewnymi wartościami:
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);
Realizacja:
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;
}
Wtedy otwarty filestream, a dla każdego obiektu zadzwonić:
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();
lub wyjście:
Entry2 e;
// set values in e
ofstream out(filename.c_str());
out << e;
out.close();
Lub jeśli chcesz użyć strumienia read
i write
, po prostu zamień odpowiedni kod w implementacji operator
s.
Gdy zmienne są prywatne wewnątrz struktury/klasy, musisz zadeklarować operator
s jako metody znajomych.
Implementujesz dowolny format/separatory, które lubisz. Gdy twój ciąg znaków zawiera spacje, użyj getline(), który pobiera łańcuch i strumień zamiast >>
, ponieważ operator>>
domyślnie używa spacji jako ograniczników. Zależy od twoich separatorów.
Niestety, zazwyczaj nie jest to możliwe. Jeśli twoja struktura zawiera tylko zwykłe dane (bez wskaźników lub złożonych obiektów), możesz zachować ją jako jedną porcję, ale należy zachować ostrożność, jeśli przenośność jest problemem. Obciążenie, rozmiar i problemy z typem danych sprawiają, że jest to problematyczne.
Można użyć funkcji Boost.Serialization, aby zminimalizować ilość kodu wymaganą do prawidłowej, przenośnej i wersjonowanej funkcji wyszukiwania.
Tak naprawdę nie ma prostego sposobu, w końcu jest to C++, a nie PHP lub JavaScript.
http://www.parashift.com/c++-faq-lite/serialization.html
doładowania ma również niektóre biblioteki dla niego: http://www.boost.org/doc/libs/release/libs/serialization ... jak już wspomniano Tronic :)
Nazywa serializacji. Na SO istnieje wiele wątków serializacyjnych.
Dostępna jest także rozbudowana biblioteka do serializacji.
http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/index.html
zasadzie można zrobić
myFile<<myObject
i
myFile>>myObject
z doładowania serializacji.
Lepszą metodą jest zapisanie każdego pola pojedynczo wraz z długością ciągu.
Alternatywnie można utworzyć tablicę char
(lub std::vector<char>
) i zapisać wszystkie elementy w buforze, a następnie zapisać bufor na wyjściu.
Podstawowym kolcem jest to, że kompilator może wstawiać dopełnienie między elementami w klasie lub strukturze. Użycie memcpy
lub std::copy
spowoduje dopełnienie bajtów zapisanych na wyjściu.
Pamiętaj tylko, że musisz wpisać długość łańcucha i treść lub treść, a następnie znak kończący.
Inne osoby zasugerują sprawdzenie biblioteki Boost Serialization.
Jeśli masz:
struct A {
char a[30], b[25], c[15];
int x;
}
następnie można napisać to wszystko tylko z zapisu (FH, PTR, sizeof (struct a)).
Oczywiście, nie jest to przenośne urządzenie (ponieważ nie oszczędzamy na poziomie docelowym lub wielkości "int", ale może to nie być problemem dla Ciebie.
Jeśli masz:
struct A {
char *a, *b, *c;
int d;
}
wtedy nie szukasz napisać obiektu; szukasz serializacji. Najlepiej jest zajrzeć do bibliotek Boost i skorzystać z ich procedur serializacji, ponieważ nie jest to łatwy problem w językach bez refleksji.
Zakładając, że Twój cel jest taki, jak stwierdzono, aby wypisać obiekt za pomocą pojedynczego wywołania funkcji write() lub fwrite() lub cokolwiek innego, najpierw musisz skopiować ciąg i inne dane obiektów do pojedynczego ciągłego bloku pamięć. Następnie możesz napisać() ten blok pamięci za pomocą jednego połączenia. Lub możesz napisać wektor, dzwoniąc do writev(), jeśli to połączenie jest dostępne na twojej platformie.
Powiedział, że prawdopodobnie nie zyska znacznie redukując liczbę połączeń zapisu. Zwłaszcza jeśli używasz już fwrite() lub podobnego, biblioteka C robi już buforowanie, więc koszt wielu małych połączeń i tak jest minimalny. Nie postawić się przez wiele dodatkowego bólu i złożoności kodu, chyba że będzie to rzeczywiście zrobić coś dobrego ...
- 1. Jak napisać tablicę do pliku w C
- 2. napisać 2d tablicy do pliku w C
- 3. Jak napisać strumień do pliku?
- 4. Jak napisać zmienną do pliku w ant?
- 5. Jak napisać do strumienia StdOut programu bezpośrednio w C#?
- 6. Jak napisać liczb całkowitych do pliku
- 7. FFmpeg Jak napisać wideo do pliku
- 8. jak napisać tablicę do pliku Java
- 9. node.js - Jak napisać tablicę do pliku
- 10. Nodejs napisać json do pliku
- 11. Jak zapisać obiekt C++ do pliku xml i przywrócić go?
- 12. C++: Jak napisać const_iterator?
- 13. Python 3. Należy napisać do pliku, sprawdzić, czy istnieje linia, a następnie ponownie napisać do pliku
- 14. Jak napisać mapę do paczki?
- 15. Obiekt C# do tablicy
- 16. Jak mogę napisać do pliku .txt w systemie Android?
- 17. Jak napisać do nazwanego deskryptora pliku w Bash?
- 18. Jak napisać listę list do pliku w Pythonie
- 19. Jak napisać Mat Float do pliku w OpenCV
- 20. Jak napisać arabski w pliku README github?
- 21. Java: Jak napisać "arabski" w pliku właściwości?
- 22. Dlaczego mogę napisać obiekt typu "c = {get a() {}}"?
- 23. Jak napisać handler Ctrl-C w Haskell?
- 24. Jak serializować obiekt w C++?
- 25. Jak napisać ten kod C# w F #
- 26. Jak przekazać obiekt z D do C++?
- 27. jak napisać ostringstream bezpośrednio do cout
- 28. Jak napisać dodatek do IE 8 w czystym zarządzanym C#
- 29. użyciu fwrite(), aby napisać struct do pliku
- 30. Jak napisać "C++" w LaTeX-ie