参考 《C++ Primer Plus》中文版 P870
#include <map> #include <fstream> #include <iostream> #include <string> using namespace std; string getData( string key, map<string, string> & data ); //using namespace std; int main(int argc, char** argv ) { map<string, string> data; string filename = "./parameters.txt"; ifstream fin( filename.c_str() ); /* c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。 */ if (!fin)//文件不存在 { cerr<<"parameter file does not exist."<<endl;//报错 return 0; } while(!fin.eof()) //文件是否为空 { string str; getline( fin, str );//把每一行放到str中,不断读取 if (str[0] == '#') { // 以‘#’开头的是注释 continue; } int pos = str.find("="); // 等于号的位置, P870 if (pos == -1) { continue; } string key = str.substr( 0, pos ); //从下标0到pos string value = str.substr( pos+1, str.length() ); data[key] = value; if ( !fin.good() ) { break; } }
float value1 = atof(getData("camera.cx",data).c_str());//上下的区别
string value2 = getData("camera.cx",data);
cout << value1 << endl;
cout << value2 << endl; }
string getData( string key ,map<string, string> & data)//成员函数 { map<string, string>::iterator iter = data.find(key);//根据键,找到值 if (iter == data.end()) { cerr<<"Parameter name "<<key<<" not found!"<<endl; return string("NOT_FOUND"); } return iter->second; //second值,first键 }
str为string类型对象,str.find()返回位置int类型。
atof 是ascII to float的缩写,它将ascII字符串转换为相应的单精度浮点数,比如传入"1.234",经过处理后就返回float类型的数1.234 。类似的还有atoi 、atol、itoa、ftoa等等。
读取的文件parameters.txt
# 这是一个参数文件 detector=ORB descriptor=ORB good_match_threshold=10 # camera camera.cx=682.3; camera.cy=254.9; camera.fx=979.8; camera.fy=942.8; camera.scale=1000.0;
float value1 = atof(getData("camera.cx",data).c_str());
string value2 = getData("camera.cx",data);
可以在终端的输出中看到上面两句程序的区别。