2010-01-25 5 views
6

Mój program czyta plik tekstowy zawierający różne wiersze tekstu dla pliku ustawień. Niektóre linie mogą być bardzo duże. Obecnie rozmiar bufora to 4096 znaków. Możliwe, że niektóre linie mogą przekroczyć to, czy to z powodu złośliwości, czy z powodu różnych czynników działających w ramach programu.Czy istnieje rozpowszechniona biblioteka C do odczytu par nazw/wartości z pliku?

Obecne procedury były dość żmudne w pisaniu, a teraz chcę rozszerzyć możliwą zawartość pliku, który będzie wymagał więcej tego żmudnego powtarzalnego kodu. (Jest to plik typu ustawień, składający się z par name value i od czasu do czasu nagłówek sekcji Niektóre wartości liczbowe muszą być odczytywane jako ciągi z powodu wielokrotnej precyzji).

Najważniejsze jest, aby odczytać dowolną długość linii bez przepełnienia bufora. Właśnie odkryłem, że getline może to dla mnie zrobić, ale czy istnieje niebiosa dla biblioteki, która zrobi dla mnie tyle nudy?

edit:

Nie chcę być zmuszony do złożenia = znakiem między nazwą i wartościami, pusta przestrzeń powinna wystarczyć jako separatora.

Powszechnie myślę, że biblioteka powinna być dostępna w standardowych pakietach popularnych dystrybucji Linuksa.

Jestem świadomy libconfig, ale wydaje się, że jestem kompletny przesadą dla moich wymagań.

Odpowiedz

1

Moja sugestia to majsterkowanie, ponieważ jest to dość łatwe.

  • Czytaj każdą linię
  • count znaków aż do separatora i po separatorze
  • przydzielić buforów
  • i czytać pary nazwa wartość z sscanf

    jak:

    sscanf(line, "%[^:]: %[^\n]", key, value);

Będziesz bezpieczny, ponieważ policzyłeś znaki przed sccanf.

+0

w tym przypadku proponuję również napisać to, wydaje się dość banalne. Jedynym problemem jest to, jak będziesz przechowywać swój stół, jeśli jest to czysty C, a nie std :: map dla ciebie, ale domyślam się, że masz już własne struktury danych? –

+0

Dzięki za sscanf% [..] napiwek, ale po testach brakuje ci karetki: '"% [^:]:% [^ \ n] "', okrzyki, idę tą trasą . –

+0

Poprawione. Przepraszam za brakującą karetkę. – piotr

4

Zajrzyj do libini, brzmi poprawnie. Jest dość stary i nie podlega gwałtownemu rozwojowi, ale jeśli już działa na twój problem, to powinno być dobrze.

Bardziej aktualną biblioteką z wieloma innymi korzyściami jest glib, ma ona key-value-parser API.

+0

Zdecydowałem się na opcję glib jako, znowu, to przesada dla moich wymagań. Odpowiedź wybrana jako poprawna, choć nie rozwiązuje bezpośrednio problemu z biblioteką, ułatwiła mi kontynuowanie i nie narusza żadnej istniejącej specyfikacji pliku używanej w istniejących plikach danych. –

+1

@ James: Zgadza się ... Chociaż byłbym skłonny sądzić, że dla jakiegokolwiek nietrywialnego programu C, glib jest zdrową zależnością, ponieważ dodaje wiele rzeczy, które są często potrzebne w takich programach. – unwind

1

Wpisałem updated fork of libini pod CCAN. Zawiera również bardzo przydatną implementację słownika, a także kilka prostych algorytmów mieszających. Rusty umieścił to w repozytorium, więc wydaje mi się, że wykonałem dość dobrą robotę, aktualizując go i naprawiając kilka drobnych błędów.

Najnowszą wersję biblioteki można znaleźć pod adresem poke through this tree, zawiera ona podstawowe wsparcie dla tokenów oraz podstawowe wsparcie transakcji (przydatne do ponownego odczytania plików konfiguracyjnych i przywracania, jeśli wystąpił błąd analizy składni). Zawiera również znacznie bardziej zaktualizowany zestaw testów jednostkowych.

Nie aktywnie podtrzymuję widelca, ponieważ oryginalny autor libini stał się znowu aktywny, jednak moduł jest utrzymywany w CCAN.

Powiązane problemy