Pomysł na ułożenie danych w zwykłym pliku - jak najprościej?

0

Cześć!
Nie mam pomysłu jak zorganizować dane w pliku tekstowym...

Chcę w pustym pliku mieć taką jakby "bazę danych". Będzie to baza cen i towarów. Na przykład:

kod towaru / nazwa towaru / cena towaru

1 chleb 2,50 zł
2 sok truskawkowy 5,70 zł
3 piwo miodowe 6,35 zł

I chcę mieć możliwość dodawania do tej bazy (pliku) produktów i odczytywania z tej bazy produktów po kodzie towaru - kod towaru to ta pierwsza cyfra.

Jaką przyjąć strukturę tego pliku żebym się nie zagrzebał przy odczycie i dodawaniu produktów?

Wszystko będę pisał w czystym C... chciałbym w jak najszerszym zakresie korzystać z gotowych funkcji.

Myślałem nad takimi strukturami:

1;chleb;2,50 zł;;
2;sok truskawkowy;5,70 zł;;
3;piwo miodowe;6,35 zł;;

albo tak:

1-chleb-2,50 zł
2-sok truskawkowy-5,70 zł
3-piwo miodowe-6,35 zł

Szukam jakiegoś prostego pomysłu żeby łatwo było mi zarządzać tą "bazą danych". Program tylko w celach edukacyjnych.

Pozdrawiam!

1

Mógłbyś zrobić coś takiego

1 2.50 chleb
2 5.70 sok truskawkowy 
3 6.35 piwo miodowe
 

Wtedy czytasz id i cenę czytasz scanf("%d %f",..) a nazwę getlinem

1

https://www.sqlite.org/cintro.html ? Po co wynajdywać koło na nowo?

3

Albo sprobuj trzymac dane w XMLach lub Jsonach, bedziesz mogl pozniej pokombinowac jak to dalej przesylac i przetwarzac (chociaz nie wiem jak to tutaj wyglada w przypadku C++)

2

Jak już tak bardzo chcesz trzymać dane w pliku to zrób sobie separator jako tabulator.

Btw. to jest faktycznie wynajdowanie koła a na dodatek słabej jakości. Od przechowywania danych są bazy danych. Potem jesteś do tyłu z technologiami.

0

Dzięki za odpowiedzi!
Panowie piszę to na przedmiot (3 rok studiów) także już teraz macie obraz jaki to jest typ programu :-)
Wszystko musi być w czystym C i informacje przechowywane w pliku.
Tylko nie chcę sobie utrudnić zadania (odczyt z pliku to tylko jeden z elementów tego programu).

Zobaczę te pomysły podrzucone przez Stryka i Shaloma.
Może te tabulator to też jest dobre wyjście?
Chociaż najlepiej chciałbym na funkcjach vide pomysł Shaloma...

6
panryz napisał(a)

Btw. to jest faktycznie wynajdowanie koła a na dodatek słabej jakości. Od przechowywania danych są bazy danych. Potem jesteś do tyłu z technologiami.

Nie wrzucaj wszystkiego do jednego worka;

Jeżeli potrzeba przechować niewielką ilość informacji, do tego mieć możliwość edycji tych danych bez konieczności uruchamiania dedykowanej aplikacji, to dużo lepszym rozwiązaniem jest użycie jednego z popularnych formatów, czyli np. INI, XML, JSON czy YAML;

Pytacz zapewne nie pracuje nad wielką aplikacją biznesową i widząc pytanie można smiało stwierdzić, że jest początkujący, więc niech sie uczy; Większość świeżaków w temacie programowania wymyśla koła na nowo i jest to potrzebne - inaczej nie nauczy się np. obsługi funkcji scanf czy innych, które przydadzą się do ładowania zawartości zwykłych plików tekstowych;

Kiedyś przyjdzie czas na obsługę systemow bazodanowych, ale póki co niech się pouczy i popróbuje różnych rzeczy.

0

@furious programming dlatego ja bym proponował aby autor wątku zaczął od plików csv. Na razie może to ręcznie parsować, a potem użyć np. ado do jego obsługi w miarę wygodny sposób. A wbrew pozorom nawet w aplikacjach biznesowych jest miejsce na obsługę tego typu rzeczy przecież. Ja sam pisałem import z wielu innych systemów czy to dokumentów czy innych rzeczy do swoich systemów.

0

@Mr.YaHooo - owszem, nawet "prawie" wspomniał o tym w pierwszym poście:

1;chleb;2,50 zł;;
2;sok truskawkowy;5,70 zł;;
3;piwo miodowe;6,35 zł;;

Separator zmienić i będzie CSV :]

3

wszystko jedno czego użyjesz, tylko nie używaj XML-a :-)

<produkty>
  <produkt>
    <numer>1</numer>
    <nazwa>chleb</nazwa>
    <cena>2.50</cena>
  </produkt>
  .
  .
  .
</produkty>

SRSLY? (tak, wiem, można z atrybutami, ale XML to i tak jedno wielkie WTF)

0

Kurczę ale mam problem jednak z tym plikiem. Coś źle myślę...
No bo tak, mam np. taką strukturę pliku:

1 chleb 2,50 zł
2 sok truskawkowy 5,70 zł
3 piwo miodowe 6,35 zł

Tylko teraz - tak jak napisałem w pierwszym poście, wyszukiwanie tych produktów ma się odbywać po kodzie towaru (czyli tej pierwszej cyfrze).
Więc wpisuję np. 3 a dostaję odpowiedź:
piwo miodowe, cena 6,35 zł

No więc jak to zrobić scanf jak baza może wyglądać tak:

1 nauka c w 1 dzien! (ksiazka) 2,50 zł
2 20 dni do okola swiata (film) 5,70 zł
3 1, 2, 3 biegasz ty (gra dla dzieci) 50 zł

Jak odseparować takie dane i jak najlepiej robić wyszukiwanie po tych kodach towarów?

Bo jak wpiszę kod np. 3 i przelecę całą bazę (cały plik) np. forem w poszukiwaniu cyfry 3 to wyjdą mi głupoty... A baza może mieć jeden towar, albo 0 albo 5000...

1

Nie wiem jak ten scanf działa, ale powinienes użyć jakiegoś gotowego formatu plików konfiguracyjnych; Głównie dlatego, że poniższa linia:

3 1, 2, 3 biegasz ty (gra dla dzieci) 50 zł

jest praktycznie niemożliwa do prawidłowego podzielenia; Ten sam znak separatora używasz do oddzielania wartości, a także jako białe znaki wewnątrz ciągu danej wartości; Musiałbyś przyjąć, że wartość do pierwszego znaku spacji to ID produktu, a wartość ceny opisana jest do drugiego białego znaku od końca; I nie zrobisz tego za pomocą scanf.

1

@krzyslotnik - poszukaj w sieci biblioteki do CSV; Wtedy podana wyżej problematyczna linia przestanie być problemem:

"3","1, 2, 3 biegasz ty (gra dla dzieci)","50 zł"
2

Jak juz skończysz z CSV (w sumie prosty format), to pomyśl, jak np zaprojektować coś podobnego w pliku binarnym.

0

I właśnie nie wiem czy nie zrobię tego w pliku binarnym. Chyba było by prościej co?
Przeraża mnie ten CSV :) Może niepotrzebnie ale nie chcę się w tym zakopać.

1

CSV nie jest zły - wszystko zależy co się chce zrobić - warto poznać jedno i drugie, bo do różnych zastosowań, dobrze jest zastosować różne rozwiązania.

1

@kaczus tylko trzeba uważać z plikami binarnymi bo czasem można sobie napędzić kłopotów. Poza tym taki sposób może być nieprzenośny pomiędzy różnymi kompilatorami.

2

Do celów edukacyjnych polecam CSV z nagłówkiem.

Za:

  • łatwość edycji
  • czytelność
  • kompaktowość

Przeciw:

  • nie jest to taki prosty format jak się wydaje (ale i tak jeden z najprostszych)

Trzeba tylko pamiętać, że CSV ma kilka opcji o czym nie każdy wie:

  • separator wartości
  • separator linii (zwykle = EOL specyficzny dla platformy)
  • znak opakowywania wartości łańcuchowych (zwykle cudzysłów)
  • obecność nagłówka (lub nie)

Kilka wyjątków o których nie wszyscy wiedzą i można się zaskoczyć:

  • jeśli pole zawiera separator pól to musi być obowiązkowo opakowane, w pozostałych przypadkach może być opakowane
  • jeśli cudzysłów (") jest znakiem opakowywania to znak cudzysłowy przedstawia się przez jego podwojenie
  • znak końca linii może wystąpić wewnątrz pola

Wersja Twoich danych testowych w CSV z nagłówkiem i separatorem = ";":

kod towaru;nazwa towaru;cena towaru
1;chleb;2,50
2;"sok truskawkowy ""Kubuś""";5,70
3;piwo miodowe;6,35

Opis formatu: https://en.wikipedia.org/wiki/Comma-separated_values

2

@Mr.YaHooo - o ile nie będzie się używać jakichś egzotycznych dziwolągów, to pliki binarne nie tylko będą przenośne pomiędzy kompilatorami, ale także będą uniwersalne dla wielu języków programowania; Wystarczy pamętać o tym, aby zapisywane do plików dane miały uniwersalny typ; Np. z liczbami jest najmniejszy problem - chyba wszystkie języki programowania obsługują 32-bitowe liczby naturalne/całkowite; Łańcuchy znaków wystarczy że będą zapisywane zawsze w tej samej stronie kodowej - najpierw zapisujemy ilość bajtów łańcucha jako np. 32-bitowa liczba natoralna, a tuż po niej fizyczny blok bajtów ciągu znaków; Odczytanie takich łańcuchów będzie banalne i nie sprawi problemów w żadnym języku;

Edit:: Ale tak jak @kaczus słusznie wspomniał w komentarzu pod tym postem - "to z dokładnością do endiana"...

Mr.YaHooo napisał(a)

Tylko o to, że przy różnych ustawieniach nawet tego samego kompilatora zabawa z plikami binarnymi (np. wczytywanie struktury z takiego pliku) może skończyć się niepowodzeniem. Pola w strukturze mogą być różnie wyrównane.

Dlatego też pola struktury wystarczy zapisywać/odczytywać manualnie; Kompilator nie może decydować o wielkości zapisywanego/odczytywanego bloku, bo pliki nie będą kompatybilne; Natomiast same dane w pliki nie mogą okreslać tego, czy są strukturą, czy obiektem, czy jeszcze czymś innym; No chyba że pliki celowo mają być nieprzenośne i nieuniwersalne;

Od tego są odpowiednie flagi, żeby były wyrównane tak jak chcemy - to, że są niebezpieczeństwa- one są wszędzię - przy CSV masz to, że separatory mogą być różne, mogą być różne kodowania liter, ba mogą być różne formatowania i zapisy liczb (przecinek/kropka ect)

Standard formatu określa, że separatorem może być przecinek - nawet sama nazwa formatu o tym mówi: **Comma Separated Values**; Jeśli separatorem wartości jest inny znak, to nie jest to wina formatu;

Ale tak to jest - ktoś opracowuje format, poświęca kupę czasu na ustalenie zasad zapisu i przechowywania danych i tworzy API do obsługi plików; Wrzuca pliki API np. do repo w GitHub; Pomysł podoba się, jest wart uwagi i zainteresowania, więc powstaje milion forków i miliard dialektów, bazowanych na pierwowzorze; I dziwić się, że po jakimś czasie nie wiadomo co jest czym...

0

Koledzy,
dzięki za wszystkie wypowiedzi, dużo się z nich uczę.

Pamiętajcie tylko proszę, że ja piszę ten program jako pracę domową z przedmiotu "podstawy programowania w c". On ma się uruchomić, mam wytłumaczyć kod i tyle.
I albo zaliczę poprawkę we wrześniu albo powtarzanie przedmiotu :-( Finał mam na początku września i chcę do tego przysiąść już teraz bo orłem z C nie jestem. Kiedyś trochę w Javie pisałem (do poziomu interfejsów, klas abstrakcyjnych, awt) i było 1000 razy lepiej a ten C to załamka.

Dlatego szukam prostego rozwiązania z tym plikiem :) Różnice kompilatorów, stawianie serwerów baz danych, optymalizacja algorytmów wyszukiwania treści to wszystko jest bardzo ważne ale nie przy mojej okazji :-) Nie ten kaliber na tego przeciwnika.

Toteż pytanie dałem w dziale "Newbie" :-)

Pozdrawiam!

Ale upał jest niesamowity, ciężko się myśli przy takiej pogodzie.

1

Jak zaimplementujesz w C taką prostą bazę z wykorzystaniem CSV to może nie będzie spacerek, ale będziesz już coś wiedział o jednym i drugim.

Dla pewności zrób do tego testy jednostkowe - najłatwiej przetestować.
Może przyspieszyć zakończenie implementacji.

0
furious programming napisał(a):

@Mr.YaHooo - o ile nie będzie się używać jakichś egzotycznych dziwolągów, to pliki binarne nie tylko będą przenośne pomiędzy kompilatorami, ale także będą uniwersalne dla wielu języków programowania;
Tak jest. Jednak według mnie pliki binarne dla początkujących są po prostu za trudne. Za dużo rzeczy do opanowania a początkujący nie wszystko przecież może wiedzieć.

furious programming napisał(a):

Dlatego też pola struktury wystarczy zapisywać/odczytywać manualnie; Kompilator nie może decydować o wielkości zapisywanego/odczytywanego bloku, bo pliki nie będą kompatybilne; Natomiast same dane w pliki nie mogą okreslać tego, czy są strukturą, czy obiektem, czy jeszcze czymś innym; No chyba że pliki celowo mają być nieprzenośne i nieuniwersalne;
I w tym tkwi sedno sprawy. Pytanie tylko czy początkujący sobie z tym poradzi? Ale jak sobie poradzi to z drugiej strony dowie się dużo, więc warto spróbować.

vpiotr napisał(a):

Jak zaimplementujesz w C taką prostą bazę z wykorzystaniem CSV to może nie będzie spacerek, ale będziesz już coś wiedział o jednym i drugim.
Ewentualnie można by korzystać z gotowych bibliotek do csv których jest masa. Nie wiem jak pod Linuxem, ale pod Windows pliki csv można odczytywać za pomocą funkcji wbudowanych w system. A mam tu na myśli ADO które z mojego doświadczenia działa dość dobrze.

2
Mr.YaHooo napisał(a):
vpiotr napisał(a):

Jak zaimplementujesz w C taką prostą bazę z wykorzystaniem CSV to może nie będzie spacerek, ale będziesz już coś wiedział o jednym i drugim.
Ewentualnie można by korzystać z gotowych bibliotek do csv których jest masa. Nie wiem jak pod Linuxem, ale pod Windows pliki csv można odczytywać za pomocą funkcji wbudowanych w system. A mam tu na myśli ADO które z mojego doświadczenia działa dość dobrze.

W projektach edukacyjnych najlepiej minimalizować korzystanie z WinAPI czy bibliotek (nawet standardowych). Ale to wszystko zależy od projektu i prowadzącego.
W projekcie symulującym coś z fizyki jak najbardziej.
W projekcie z algorytmiki lepiej napisać wszystko (albo prawie wszystko) samemu.

0

Dalej nie wiem jakie rozwiązanie przyjąć :(
Może spróbuję ze zwykłym plikiem tekstowym i jako separator ;
Nie wiem tylko jak wyszukiwać pod kodach towaru ale może wyjdzie coś w praniu. :-)

1

Ładuj całą linię i ekstrahuj pierwszy podciąg do konwersji i porównania; Samo porównywanie zakończ wtedy, gdy znajdziesz szukany numer towaru - będziesz miał od razu całą linię, z której będziesz mógł wyciągnąć pozostałe wartości.

0

@furious programming a jeśli tych danych jest mało, to może spróbować ładować to do pamięci podczas startu programu jako tablica struktur i wtedy wyszukiwać? Oczywiście po każdym zapisie czy zmianie danych należałoby zapisywać całość z powrotem co pliku aby nic nie stracić w przypadku awarii programu. Takie coś byłoby wygodniejsze moim zdaniem.

0

@furious programming a jeśli tych danych jest mało, to może spróbować ładować to do pamięci podczas startu programu jako tablica struktur i wtedy wyszukiwać?

Wcale nie musi ich być jakoś bardzo mało - pamięci raczej nikomu nie braknie, jak plik będzie miał nawet kilka megabajtów, a to już dość sporo informacji :]

Można ładować wszystko do pamięci i powolutku sobie wszystko pokopiować do natywnych struktur, ale nie zawsze opłacalne jest takie rozwiązanie; Jeśli dane w pliku zapisane będą w prostej formie, która nie wymaga formatowania zawartości czy odwoływania się do definicji w dalszej części pliku (jak choćby w przypadku TreeStructInfo1 i definicji referencjonowanych elementów poza głównym ciałem drzewa), to spokojnie można wczytywać dane z pliku linia po linii; Trochę trudniej będzie, jeśli jeden zestaw danych może być opisany w wielu liniach (jak np. w CSV), to można pokusić się o załadowanie całości do pamięci;

Ale to raczej nie dotyczy bieżącego problemu, bo pytacz potrzebuje bardzo prostej formy zapisu informacji, więc nie ma co utrudniać sobie roboty; Tym bardziej, że jeśli pytacz skorzysta z formatu CSV, to powinien użyć istniejącego API do obsługi tych plików; Ewentualnie w ramach ćwiczeń można machnąć sobie API z podstawową funkcjonalnością, ale to już zależy od pytacza;

Oczywiście po każdym zapisie czy zmianie danych należałoby zapisywać całość z powrotem co pliku aby nic nie stracić w przypadku awarii programu. Takie coś byłoby wygodniejsze moim zdaniem.

I tak i nie;

Jedne API pozwalają na edycję zawartości pliku bez jawnego jej zaladowania do pamięci, ale dając natychmiastową aktualizację plików; Takim przykładem są pliki INI i systemowe funkcje; Inne z kolei umożliwiają zbudowanie modelu dokumentu (DOM) i możliwość zaktualizowania pliku w dowolnym momencie, a nie po każdej zmianie;

Plusem tych pierwszych jest to, że przy bardzo małych konfiguracjach nie ma potrzeby pisać wielu linii kodu, tworzyć obiektów itd. - wystarczy wywołać jedną instrukcję; Natomiast minusem jest to, że przy dużych plikach i większej ilości modyfikacji danych, kod będzie działać wolno, bo za każdym razem plik będzie otwierany, modyfikowany i zamykany, o to trochę trwa; Dlatego też lepszym rozwiązaniem będzie użycie DOMu, dla którego API załaduje zawartość pliku do pamięci, da możliwość modyfikacji danych bez aktualizowania co chwilę pliku, ale także da możliwość zaktualizowania pliku na żądanie (za pomocą przewidzianej metody/metod) oraz w destruktorze obiektu modelu dokumentu;

To drugie jest według mnie lepszym rozwiązaniem, bo jest szybsze i wygodniejsze.

[1] Oczywiście istnieje sposób na ładowanie danych linia po linii, jednak taki proces ładowania jest trudniejszy w implementacji i wymaga umiejętnego zarządzania już wczytanym łańcuchem, a także pomijania pustych linii i indentacji.

0
furious programming napisał(a):

Wcale nie musi ich być jakoś bardzo mało - pamięci raczej nikomu nie braknie, jak plik będzie miał nawet kilka megabajtów, a to już dość sporo informacji :]
Pytanie tylko jak długo dane będą wczytywane. Ja osobiście nie lubię czekać i nawet 1-2 sekundy podczas pokazywania okna mnie trochę denerwuje.

furious programming napisał(a):

Można ładować wszystko do pamięci i powolutku sobie wszystko pokopiować do natywnych struktur, ale nie zawsze opłacalne jest takie rozwiązanie; Jeśli dane w pliku zapisane będą w prostej formie, która nie wymaga formatowania zawartości czy odwoływania się do definicji w dalszej części pliku (jak choćby w przypadku TreeStructInfo1 i definicji referencjonowanych elementów poza głównym ciałem drzewa), to spokojnie można wczytywać dane z pliku linia po linii; Trochę trudniej będzie, jeśli jeden zestaw danych może być opisany w wielu liniach (jak np. w CSV), to można pokusić się o załadowanie całości do pamięci;
Oczywiście, jeśli pliki mają określoną strukturę typu nagłówek xx bajtów następnie blok informacji składający się z yy bajtów na rekord (struktura typu *.dbf) nie ma sensu wczytywać tego do pamięci, tylko można pokusić się o zapis bezpośrednio na dysku. Jednak tu dochodzimy znowu do sprawy szybkości. Z reguły dysk jest wolniejszy niż RAM i może być małe przetrzymanie podczas zapisywania. Dlatego można by się pokusić o buforowanie w pamięci RAM tak jak to robią serwery bazodanowe.

furious programming napisał(a):

Ale to raczej nie dotyczy bieżącego problemu, bo pytacz potrzebuje bardzo prostej formy zapisu informacji, więc nie ma co utrudniać sobie roboty; Tym bardziej, że jeśli pytacz skorzysta z formatu CSV, to powinien użyć istniejącego API do obsługi tych plików; Ewentualnie w ramach ćwiczeń można machnąć sobie API z podstawową funkcjonalnością, ale to już zależy od pytacza;
Jak najbardziej odchodzimy od głównego tematu i to coraz dalej.

furious programming napisał(a):

I tak i nie;
Raczej nie sprzedawałbyś programu który w wyniku awarii zasilania traci dane wprowadzone od ostatniego uruchomienia...

furious programming napisał(a):

Jedne API pozwalają na edycję zawartości pliku bez jawnego jej zaladowania do pamięci, ale dając natychmiastową aktualizację plików; Takim przykładem są pliki INI i systemowe funkcje; Inne z kolei umożliwiają zbudowanie modelu dokumentu (DOM) i możliwość zaktualizowania pliku w dowolnym momencie, a nie po każdej zmianie;
Oczywiście i te pierwsze moim zdaniem są o wiele lepsze.

furious programming napisał(a):

Plusem tych pierwszych jest to, że przy bardzo małych konfiguracjach nie ma potrzeby pisać wielu linii kodu, tworzyć obiektów itd. - wystarczy wywołać jedną instrukcję; Natomiast minusem jest to, że przy dużych plikach i większej ilości modyfikacji danych, kod będzie działać wolno, bo za każdym razem plik będzie otwierany, modyfikowany i zamykany, o to trochę trwa; Dlatego też lepszym rozwiązaniem będzie użycie DOMu, dla którego API załaduje zawartość pliku do pamięci, da możliwość modyfikacji danych bez aktualizowania co chwilę pliku, ale także da możliwość zaktualizowania pliku na żądanie (za pomocą przewidzianej metody/metod) oraz w destruktorze obiektu modelu dokumentu;
Pamiętam jak pisałem swego czasu program do pomiaru aktualnej prędkości łącza oraz mierzący ilość przesłanych danych z podziałem na 2 taryfy noc i dzień. Zapisywałem to do pliku ini. Pisane było za pomocą standardowego komponentu TIniFile z C++ Buildera i niestety zapisywanie wszystkiego co 1s (bo w takich okresach odświeżałem dane) spowodowało że malutki program w statystykach IO był na jednym z pierwszych miejsc pod względem zapisanych/odczytanych bajtów.

furious programming napisał(a):

To drugie jest według mnie lepszym rozwiązaniem, bo jest szybsze i wygodniejsze.
A to już co kto woli. Ja nie mam dobrych wspomnien z DOM, ale to może przez słabą obsługę w Builderze.

A właśnie zamiast csv niech nasz pytacz rozpracuje pliki dbf? Nie ma problemu z kilkoma liniami, dane są uporządkowane tak, że wielkość rekordu jest stała, więc można odczytywać wybrany rekord bez czytania innych. Na początek nie musiałby pisać obsługi indeksów, same pliki z danymi wystarczą.

0

Raczej nie sprzedawałbyś programu który w wyniku awarii zasilania traci dane wprowadzone od ostatniego uruchomienia...

Aha, czyli według Ciebie wszystkie programy, które korzystają z DOMu są bezwartościowe? Bo przecież zbudowanie modelu dokumentu w pamięci wiąże się z załadowaniem całego pliku/strumienia, dzięki czemu operuje się cały czas na pamięci RAM;

Pamętaj, że bazy danych to jedno, a konfiguracje to drugie; Bazy nie ładuje się w całości do pamięci, bo to sensu nie ma; Poza tym takie bazy mogą zajmować dużo więcej przestrzeni niż cała dostępna dla procesu pamięć, dlatego takie rozwiązanie było by bezwartościowe; Natomiast nic nie stoi na przeszkodzie, aby konfigurację ładować w całości, bo to zwykle nieduże pliki, a rodzaj danych nie jest tak ważny jak w przypadku danych w bazach; Poza tym model dokumentu można w dowolnej chwili zapisać do pliku, kiedy tylko będzie to konieczne, więc w momencie awarii albo mamy zapisaną zawartość nowego modelu, albo mamy plik z poprzednią konfiguracją;

Przykładem jest konfiguracja aplikacji desktopowej czy gry - w pamięci znajduje się załadowana w całości konfiguracja, użytkownik/gracz wchodzi w ustawienia i zmienia co mu potrzeba; Wybiera opcję Save, co powoduje zaktualizowanie danych w modelu, a on sam zapisywany jest do pliku; Nic w tym dziwnego, bo plik zostaje zaktualizowany tylko raz; Gdyby klasa obsługująca model wykonywała aktualizację po każdej zmianie zawartości modelu, to plik byłby aktualizowany wiele razy, a potrzebny byłby tylko ten jeden raz;

Oczywiście i te pierwsze moim zdaniem są o wiele lepsze.

W tym rzecz że ani jedno, ani drugie, a raczej i jego i drugie;

Wszystko zależy od przypadku - m.in. od przeznaczenia zbioru danych, typu przechowywanych informacji i ich ważności; Nie można jednoznacznie wskazać lepszego rozwiązania, bo dla ogółu taki nie istnieje;

Pisane było za pomocą standardowego komponentu TIniFile z C++ Buildera i niestety zapisywanie wszystkiego co 1s (bo w takich okresach odświeżałem dane) spowodowało że malutki program w statystykach IO był na jednym z pierwszych miejsc pod względem zapisanych/odczytanych bajtów.

No i sam widzisz, że aktualizowanie pliku co sekundę jest złym rozwiązaniem; Mogłeś skorzystać z klasy TMemIniFile i operować tylko i wyłącznie na danych na stercie (głównie albo tylko i wyłącznie na RAM) i nie mieliłbyś dyskiem; Jeśli co sekundę używałeś jakiejkolwiek metody zapisującej dane w jakimś kluczu, np. WriteString, to za każdym razem aktualizowałeś cały plik, bo tak właście działa klasa której użyłeś; TMemIniFile wszystko keszuje i daje możliwość wybrania momentu, w którym model zostanie zserializowany do pliku;

A właśnie zamiast csv niech nasz pytacz rozpracuje pliki dbf?

Pytacz chyba się przestraszył, ale może niech lepiej sam wybierze, żeby potrafił z tego skorzystać.

0

Pytacz kilka razy dziennie czyta ten temat i uważnie obserwuje dyskusję :)
Jest dla mnie bardzo pouczająca.

Myślałem jednak, że będzie to trochę prostsze. Przez ostatnie kilka dni nie napisałem nawet linijki kodu bo te upały już mnie wykańczają. W poniedziałek znowu do tego przysiądę i zrobię tak, że napiszę sobie cały projekt BEZ obsługi pliku - tzn. ten fragment programu zostawię na "później". Zrobię wszystko oprócz tego. To jest program typu klient-serwer (ale bardzo prosty), dokumentacja doxygen, konspekt do projektu. Więc troszkę roboty mam oprócz tej obsługi pliku.

I jak nic mi nie wpadnie do głowy przez ten najbliższy tydzień to spróbuję coś napisać w czystym C bez obsługi csv/dbf. Jak nie ogarnę to może podejdę do tych plików dbf.

A jak to też będzie ciężko mi szło to pomyślę nad outsourcingiem tego fragmentu kodu z obsługą plików ;-) Ile takie coś mogłoby kosztować w wersji "for student"?

Pozdrawiam i dziękuję za wszystkie wypowiedzi!

1 użytkowników online, w tym zalogowanych: 0, gości: 1