This is something simple I came up with for this question. I’m not entirely happy with it and I saw it as a chance to help improve my use of STL and streams based programming.
std::wifstream file(L'\\Windows\\myini.ini'); if (file) { bool section=false; while (!file.eof()) { std::wstring line; std::getline(file, line); if (line.empty()) continue; switch (line[0]) { // new header case L'[': { std::wstring header; size_t pos=line.find(L']'); if (pos!=std::wstring::npos) { header=line.substr(1, pos); if (header==L'Section') section=true; else section=false; } } break; // comments case ';': case ' ': case '#': break; // var=value default: { if (!section) continue; // what if the name = value does not have white space? // what if the value is enclosed in quotes? std::wstring name, dummy, value; lineStm >> name >> dummy; ws(lineStm); WCHAR _value[256]; lineStm.getline(_value, ELEMENTS(_value)); value=_value; } } } }
How would you improve this? Please do not recommend alternative libraries – I just want a simple method for parsing out some config strings from an INI file.
I would use boost::regex to match for every different type of element, something like:
the regular expressions might need some tweaking.
I would also replace de stream.getline with std::getline, getting rid of the static char array.