c ++ - Metoder til lagring af applikationsdata/indstillinger uden registreringsdatabasen?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har brug for nogle metoder til lagring og hentning af data fra en fil (i WIN32 api c ++-applikation, ikke MFC eller .NET)


f.eks. gemmer x, y, bredden og højden af ​​vinduet, når du lukker det, og indlæser dataene, når du åbner vinduet.


Jeg har forsøgt .ini filer, med funktionerne - WritePrivateProfileString og ReadPrivateProfileString/Int, men på MSDN står det


'Denne funktion er kun tilgængelig for kompatibilitet med 16-bit Windows-baserede applikationer. Programmer skal gemme initialiseringsoplysninger i registreringsdatabasen.'


og da jeg prøvede på min Windows7 64bit maskine til at læse en ini-fil, fik jeg blå skærm! (i fejlfindingstilstand med visuel studio) O.O


Jeg bemærker, at de fleste andre applikationer bruger XML til at gemme data, men jeg har ikke en anelse om, hvordan man læser/skriver xml-data i c ++, er der biblioteker eller windows-funktioner, som giver mig mulighed for at bruge xml-data?


Eventuelle andre forslag ville også være gode, tak.

Bedste reference


TinyXML er en populær og enkel XML-parser til C ++. [10]


Bortset fra det kan du virkelig bruge et hvilket som helst format, du vil gemme dine indstillinger, selvom det anses for god praksis at holde indstillinger i tekstformat, så de kan redigeres om nødvendigt, hvis det er nødvendigt.


Det er ret nemt at skrive dine egne funktioner til at læse/skrive en fil i INI eller lignende format. Formatet er helt op til dig, så længe det er letforståeligt for mennesker. Nogle muligheder er:


; Comment
# Comment
Key = Value (standard INI format)
Key Value
Key: Value

Andre referencer 1


Der er ikke noget galt med .ini-filer, det eneste problem med dem er, hvor de skal skrive dem. CIniFile fra CodeProject er god nok klasse. Ini-filen skal placeres i \%APPDATA\%/<Name Of Your Application> (eller \%LOCALAPPDATA\%<Same Name Here>, som beskrevet nedenfor). [11]


EDIT: Hvis vi taler om Windows-familien af ​​operativsystemer fra Windows 2000 og derefter, er funktion SHGetFolderPath en bærbar måde til at hente brugerspecifikke mapper, hvor applikationskonfigurationsfiler skal gemmes. Hvis du vil gemme data i romaing-mappen, skal du bruge CSIDL\_APPDATA med SHGetFolderPath. Hvis du vil gemme data til den lokale mappe, skal du bruge CSIDL\_LOCAL\_APPDATA. [12]


Forskellen mellem lokal og roaming mappe er i beskaffenheden af ​​de data, der skal lagres. Hvis dataene er for store eller maskinspecifikke, skal du gemme dem i lokal mappe. Dine data (koordinater og størrelse af vinduet) er lokale af naturen (på en anden maskine kan du have forskellige opløsninger), så du skal faktisk bruge CSIDL\_LOCAL\_APPDATA.


Windows Vista og senere har udvidet funktion SHGetKnownFolderPath med sit eget sæt af konstanter, men hvis du søger kompatibilitet, hold dig til den tidligere SHGetFolderPath. [13]

Andre referencer 2


Du kunne bruge Boost.PropertyTree til dette. [14]



  Ejendomstræer er alsidige data
  strukturer, men er især
  egnet til at holde konfigurationsdata.
  Træet giver sit eget,
  træspecifik grænseflade og hver knudepunkt
  er også en STL-kompatibel sekvens for
  dens barn knudepunkter.



Det understøtter serialisering, og det er også velegnet til styring og vedvarende udskiftelige konfigurationsdata. Her er et eksempel på, hvordan du indlæser og gemmer ved hjælp af XML-dataformatet, som dette bibliotek understøtter. [15]


Biblioteket bruger RapidXML internt, men gemmer parsing og kodning detaljer, hvilket vil spare dig for en vis implementeringstid (XML-biblioteker har alle deres idiosyncracies), mens du stadig tillader at bruge XML som datarepræsentation på disk. [16]

Andre referencer 3


Mens INI-filer muligvis ikke er det bedste format, tror jeg, du kan sikkert ignorere advarslen MSDN sætter på WritePrivateProfileString og ReadPrivateProfileString.


Disse to funktioner går aldrig væk. Det ville bryde tusindvis af ansøgninger.


Denne advarsel har været der i årevis, og jeg formoder, blev tilføjet, da registreringsdatabasen var al raseri, og nogen troede, at det en dag ville erstatte INI-filer fuldstændigt.


Jeg kan måske være forkert, men det ville være meget i modsætning til Microsoft at bryde så mange eksisterende apps som dette uden gode grunde. (Ikke at de ikke lejlighedsvis bryder baglæns kompatibilitet, men det ville medføre store problemer for nul fordel.)

Andre referencer 4


libxml2. Jeg har set mange steder hvor den bruges. Nem at bruge og masser af eksempler for at komme i gang og ikke et stort bibliotek som sådan. Og i C, tag det, hvor du vil. [17]

Andre referencer 5


pugixml er et andet godt (og vel dokumenteret) XML parser bibliotek. Og hvis du kan lide bærbarhed, er XML en bedre mulighed. [18]

Andre referencer 6


Åhh, min GUD? Har du nogensinde tænkt på stright-forward løsning snarere end at tænke på Super-Duper-all-can-do ramme måde?


Undskyld...


Vil du gemme to tal mellem genstarter ???


Gem: Åbn en fil, skriv disse to tal, luk filen:


std::ifstream out(file\_name);
out << x << ' ' << y;
out.close();


Indlæs: Åbn en fil, læs disse to tal, luk filen:


std::ifstream in(file\_name);
if(!in) return error...
in >> x >> y;
if(!in) return error...
in.close();

Andre referencer 7


Libconfig er den bedste løsning i C ++ så vidt jeg har forsøgt.
Fungerer multi platform med minimal kodning.
Du må prøve det! [19]

Andre referencer 8


Kom nu bare gem de data, du har brug for i en tekstfil. Du kan også skrive en tynd wrapper API til den funktionalitet. Hvad er problemet?