"Najlepsze" formaty plików wejściowych dla C++? [zamknięte]

Zaczynam pracę nad nowym oprogramowaniem, które będzie wymagało solidnego i rozszerzalnego pliku IO. Istnieje wiele formatów. XML, JSON, INI itp. Jednak zawsze są plusy i minusy, więc pomyślałem, że poproszę o wkład społeczności.

Oto kilka szorstkich wymagań:

  1. format jest "standardem"...Nie chcę odkrywać koła na nowo, jeśli nie muszę. Nie musi to być formalny standard IEEE, ale coś, co można Google i uzyskać pewne informacje na temat jako nowy użytkownik, może mieć pewne narzędzia wsparcia (edytory) poza vi. (chociaż użytkownicy oprogramowania będą ogólnie znający komputer i chętnie korzystają z vi.) {]}
  2. łatwo integruje się z C++. Nie chcę ciągnąć biblioteki 100mb i trzech różnych kompilatorów, aby ją uruchomić.
  3. obsługuje wejścia tabelaryczne (2d, N-wymiarowe)
  4. obsługuje typy POD
  5. można rozszerzyć, ponieważ wymagana jest większa liczba wejść, dobrze wiąże się ze zmiennymi, itd.
  6. szybkość parsowania nie jest strasznie ważna
  7. idealnie, tak łatwo napisać (odbić), jak czytać
  8. działa dobrze na Windows i Linux
  9. Obsługuje komponowanie (jeden plik odwołuje się do innego pliku do odczytu, i tak dalej.)
  10. Czytelny Dla Człowieka

W idealnym świecie, użyłbym biblioteki tylko nagłówkowej lub jakiejś czystej implementacji STL, ale nie przeszkadza mi wykorzystanie Boost lub jakiejś małej zewnętrznej biblioteki, jeśli działa dobrze.

Więc jakie są Twoje myśli na różnych formatach? Wady? Zalety?

Edit

Opcje do rozważenia? Coś jeszcze do dodania?

  • XML
  • YAML
  • SQLite
  • Bufory Protokołu Google
  • Zwiększ Serializację
  • INI
  • JSON
Author: mvp, 2013-02-05

4 answers

Istnieje jeden doskonały format, który spełnia wszystkie Twoje kryteria:

SQLite!

Proszę przeczytać Artykuł o używaniu SQLite jako formatu pliku aplikacji. Również, proszę oglądaj Google Tech Talk Autor: D. Richard Hipp (autor SQLite) na ten właśnie temat.

Teraz zobaczmy, jak SQLite spełnia Twoje wymagania:

Format jest "standard"

SQLite stał się formatem wyboru dla większości środowisk mobilnych i dla wielu aplikacji komputerowych (Firefox, Thunderbird, Google Chrome, Adobe Reader, to nazwę).

Łatwo integruje się z C++

SQLite posiada standardowy interfejs C , który jest tylko jednym plikiem źródłowym i jednym plikiem nagłówkowym. Istnieją również } wrappery C++ .

Obsługuje wejścia tabelaryczne (2D, N-wymiarowe)

Tabela SQLite jest tak tabelaryczna, jak możesz sobie wyobrazić. Reprezentować powiedz dane 3-wymiarowe, Utwórz tabelę z kolumnami x,y,z,value i zapisz swoje dane jako zbiór wierszy w następujący sposób:

x1,y1,z1,value1
x2,y2,z2,value2
...

Obsługuje typy POD

Zakładam, że przez POD miałeś na myśli zwykłe stare dane, lub BLOB. SQLite pozwala przechowywać pola BLOB w takim stanie, w jakim jest.

Może rozwinąć się, gdy wymagana jest większa liczba wejść, dobrze wiąże się ze zmiennymi

Tutaj naprawdę świeci.

Szybkość parsowania nie jest straszna ważne

Ale prędkość SQLite jest znakomita. W rzeczywistości parsowanie jest w zasadzie przezroczyste.

Idealnie, tak łatwo pisać (odbijać) jak czytać

Po prostu użyj INSERT do pisania i SELECT do czytania - co może być łatwiejsze?

Działa dobrze na Windows i Linux

You bet, i wszystkie inne platformy, jak również.

Obsługuje compositing (jeden plik odwołuje się do innego pliku do Czytaj)

Możesz dołączyć jedną bazę danych do drugiej.

Czytelny Dla Człowieka

Nie w binarnym, ale istnieje wiele doskonałych przeglądarek/edytorów SQLite. Lubię SQLite Expert Personal na Windows i sqliteman na Linuksie. Istnieje również wtyczka SQLite editor dla Firefoksa .


Są inne zalety, które SQLite daje za darmo:

  • Dane są indeksowalny, co sprawia, że bardzo szybkie wyszukiwanie. Po prostu nie można tego zrobić za pomocą XML, JSON lub innych formatów tekstowych.

  • Dane mogą być edytowane częściowo , nawet gdy ilość danych jest bardzo duża. Nie musisz przepisywać kilku gigabajtów, aby edytować tylko jedną wartość.

  • SQLite jest w pełni transakcyjny : gwarantuje, że Twoje dane są spójne przez cały czas. Nawet jeśli Twoja aplikacja (lub cały komputer) ulegnie awarii, Twoje dane będą automatycznie przywrócony do ostatniego znanego spójnego stanu przy następnej pierwszej próbie połączenia z bazą danych.

  • SQLite przechowuje Twoje dane verbatim : nie musisz się martwić o unikanie znaków śmieci w Twoich danych (w tym zero bajtów osadzonych w ciągach) - po prostu Zawsze używaj prepared statements, to wszystko, czego potrzeba, aby było przejrzyste. Może to być duży i irytujący problem przy radzeniu sobie z formatami danych tekstowych, XML w szczególna.

  • SQLite przechowuje wszystkie ciągi w Unicode: UTF-8 (domyślnie) lub UTF-16. Innymi słowy, nie musisz się martwić o kodowanie tekstu lub międzynarodowe wsparcie dla formatu danych.

  • SQLite pozwala na przetwarzanie danych w małych kawałkach (w rzeczywistości wiersz po wierszu), dzięki czemu działa dobrze w warunkach niskiej pamięci . Może to być problem dla dowolnych formatów tekstu, ponieważ często muszą one załadować cały tekst do pamięci, aby go przeanalizować. Przyznane, istnieje kilka wydajnych parserów XML opartych na strumieniu, ale ogólnie każdy parser XML będzie bardzo chciwy w porównaniu do SQLite.

 18
Author: mvp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-12 06:24:08

Po pracy z XML i json, oto moja dość subiektywna opinia o obu rozszerzalnych formatach serializacji:

  • format jest "standardem": tak dla obu
  • łatwo integruje się z C++: tak dla obu. W każdym przypadku prawdopodobnie skończysz z jakąś biblioteką do obsługi tego. W Linuksie libxml2 jest standardem, a libxml++ jest dla niego wrapperem C++; powinieneś być w stanie uzyskać oba z menedżera pakietów twojej dystrybucji. To zajmie trochę małych staraj się, aby ci, którzy pracują na Windows. Wydaje się, że wsparcie dla JSON jest pewne, ale nie używałem go; zawsze miałem do czynienia z JSON przy użyciu bibliotek. Tak naprawdę trasa biblioteczna też nie jest zbyt uciążliwa.
  • obsługuje wejścia tabelaryczne (2d, N-wymiarowe): tak dla obu
  • obsługuje typy POD: tak dla obu
  • można rozszerzyć, ponieważ wymagana jest większa liczba wejść: tak dla obu - to jedna duża zaleta dla obu.
  • dobrze wiąże się ze zmiennymi: jeśli masz na myśli jakiś sposób wewnątrz samego pliku, aby powiedzieć " Ten fragment danych musi być automatycznie deserializowany do tej zmiennej W moim programie", a następnie nie dla obu.
  • równie łatwo pisać (odbijać) jak czytać: zależy od używanej biblioteki, ale z mojego doświadczenia tak dla obu. (Można rzeczywiście wykonać tolerowane zadanie pisania json za pomocą printf ().)
  • działa dobrze na Windows i Linux: tak dla obu, i to samo Mac OS X dla tej sprawy.
  • obsługuje jeden plik odwołujący się do drugiego plik do przeczytania: jeśli masz na myśli coś podobnego do C #include, To XML ma pewną zdolność do tego (np. encje dokumentów), podczas gdy json nie.
  • czytelny dla człowieka: oba są zazwyczaj zapisywane w UTF-8 i pozwalają na łamanie linii i wcięcia, a tym samym mogą być czytelne dla człowieka. Jednak właśnie pracowałem z plikiem XML 479 KB, który jest w jednej linii, więc musiałem go uruchomić przez prettyprinter, aby to zrozumieć. json może być również dość nieczytelne, ale z mojego doświadczenia jest często sformatowany lepsze niż XML.

Rozpoczynając nowe projekty, generalnie wolę json; jest bardziej zwarty i czytelny dla człowieka. Głównym powodem, dla którego mogę wybrać XML zamiast json byłoby, gdybym martwił się o otrzymywanie źle uformowanych dokumentów, ponieważ XML obsługuje automatyczną weryfikację formatu dokumentu, a ty musisz napisać własny kod weryfikacyjny za pomocą json.

 8
Author: Bob Murphy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-05 19:35:01

Sprawdź bufory google . To zaspokaja większość twoich wymagań.

Z ich dokumentacji , kroki wysokiego poziomu to:

Definiowanie formatów wiadomości w a .plik proto.
Użyj kompilatora bufora protokołu.
Użyj bufora protokołu C++ API do zapisu i odczytu wiadomości.

 4
Author: David D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-05 04:27:01

Dla moich celów, myślę, że droga do zrobienia jest XML .

  1. format jest standardem, ale pozwala na modyfikację i elastyczność schematu, aby zmieniać się w miarę rozwoju wymagań programu.
  2. istnieje kilka opcji bibliotecznych. Niektóre są większe (Xerces-C) niektóre są mniejsze (ezxml), ale istnieje wiele opcji, więc nie będziemy zablokowani do jednego dostawcy lub bardzo konkretnego rozwiązania.
  3. może obsługiwać wejścia tabelaryczne (2D, N-wymiarowe). Wymaga to więcej parsowanie działa na" naszym " końcu i jest prawdopodobnie najsłabszym punktem dla XML.
  4. obsługuje typy POD: absolutnie.
  5. może rozszerzać się, ponieważ wymagana jest większa liczba wejść, dobrze wiąże się ze zmiennymi itp. poprzez modyfikacje schematu i modyfikacje parsera.
  6. szybkość parsowania nie jest zbyt ważna, więc przetwarzanie pliku tekstowego lub plików nie jest problemem.
  7. XML może być zapisywany programowo tak samo łatwo jak odczyt.
  8. działa dobrze na Windows i Linux lub każdym innym systemie operacyjnym, który obsługuje C i pliki tekstowe.
  9. Obsługuje komponowanie (jeden plik odwołuje się do innego pliku do odczytu, i tak dalej.)
  10. czytelny dla ludzi z wieloma edytorami tekstu (Sublime, vi, itp.) obsługa podświetlania składni po wyjęciu z pudełka. Wiele przeglądarek internetowych dobrze wyświetla dane.

Dzięki za wszystkie świetne opinie! Myślę, że gdybyśmy chcieli czysto binarne rozwiązanie, bufory protokołów lub boost:: serializacja jest prawdopodobnie sposób, że poszlibyśmy.

 -6
Author: DigitalInBlue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-08 19:25:44