Be sure to treat state and configuration separately. It doesn't matter on Windows as far as I know (they go in the same location), but on Linux those are supposed to go in different places.
Many programs get this wrong, and it is quite annoying as I track my config files in git. I don't want a diff just because the list of recently opened files changed! Or even worse: the program stores the last window size and position in the config file... (looking at you KDE!)
Here are some libraries I found to help with this in a cross platform way:
I haven't tried either, haven't written such a program yet.
As for how to store data, there are indeed many options, depending on your needs:
- Plain text based formats (toml, yaml, JSON, ini, ...) can be good for configs and basic state. As a bonus it let's the user easily manage the file in version control if they are so inclined.
- Databases (SQLite mostly)
- Custom formats (binary files in a directory structure is often used for browser caches for example) .
Without knowing more it is hard to give specific advise.