如果您使用流,则为此编写自己的解析器应该相当容易。您可以使用std::ifstream 读取文件:
std::ifstream ifs("filename.ext");
if(!ifs.good()) throw my_exceptions("cannot open file");
read_file(ifs);
因为它看起来是面向行的,所以你会先读取行,然后处理这些:
void read_file(std::istream& is)
{
for(;;) {
std::string line;
std::getline(is, line);
if(!is) break;
std::istringstream iss(line);
// read from iss
}
if(!is.eof()) throw my_exceptions("error reading file");
}
对于实际的解析,您可以1) 首先查看第一个字符。如果那是[,将其从流中弹出,并使用std::getline(is,identifier,']') 读取'[' 和']' 中的任何内容。如果不是[,则使用std::getline(is, key, '=') 读取键值对的左侧,然后使用std::getline(is, value) 读取右侧。
注意:不幸的是,流输入通常并不快如闪电。 (不一定要那样,但在实践中经常是这样。)然而,一旦你知道很少的模式来处理它的特性,它真的很容易做到,而且很容易做到正确(比如if(strm.good()) 和if(strm) 不同,也不是if(strm.bad()) 的对立面,还有一些你必须习惯的东西)。对于像从磁盘读取 ini 文件这样对性能至关重要(har har!)的事情,在 1,000,000 个案例中的 999,999 个案例中,它应该足够快。