C++ 读取文件内容,分割出字符串

来源:互联网 发布:淘宝上找iphone可靠吗 编辑:程序博客网 时间:2024/05/29 10:59

在c++/c等,经常有需要从文件读取参数值的场景,非常常用,实现的细节主要有,读取文件内容/行,按要求分割成字符串,或者编成键值对供调用。
1.如果是每行都是字符串+空格+字符串形式的话,
最简单的是采用输出输入流的方法,比如伪代码:

ifstream fsf(文件路径);//只能读取一行,多行的话用循环,以fsf.eof,fsf.good或者确定行数为终止条件getline(fsf, sline);stringstream ss;string a,b,c;ss<<sline;ss>>a>>b>>c;fsf.close();

如果sline = “x y z”;
那么经过上述操作后,a=x; b=y; c=z;
关于打开文件的ifstream的类,还有fstream,ofstream,参考这篇博文吧;或者:http://www.cplusplus.com/doc/tutorial/files/
2. 也可以采用其他方法,比如转为char 型,或者就用char型,然后用strtok函数,string char 型,调用c_str() ,用法strtok(char *,分隔符),详见链接例子。
另外string还有 find/substr()方法可用,用法 substr(pos,len);
3.文件内容丰富的,比如有注释,参数采用键值对的形式说明,比如:dir=./src/parameters.txt之类的,提供一个范例:

#include <string>#include <map>using namespace std;//定义一个读取参数文件的类class ParameterReader{public:    ParameterReader( string filename = "/home/lab/CalAngle/parameters.txt")    {        ifstream fin(filename.c_str());        if (!fin)        {            cerr<<"parameter file misseed"<<endl;            return;        }        while(!fin.eof()) //eof(): 如果读文件到达文件末尾,返回true。else :fail() etc.        {            string str;            getline(fin,str);            if (str[0] == '#')              {                  // 以‘#’开头的是注释                  continue;              }          int pos = str.find("=");          if (pos == -1)              continue;          // 找到"="的位置,以此为界,前面是键,后面是值           string key = str.substr( 0, pos );          string value = str.substr( pos+1, str.length() );          data[key] = value;          //include all bad situations          if ( !fin.good() )              break;        }    }    //接口函数,提供“键”,对象调用这个方法就可以获得“值”    string getData(string key)    {        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 is the value, first is the key    }public:    map <string,string> data;};

调用方法示例:

 ParameterReader pd; string rgbDir   =   pd.getData("rgb_dir");

parameters.txt里面的内容示例:

# 等号附近没有空格# 数据所在目录rgb_dir=/home/lab/CalAngle/data/fr1_desk/rgb/# 最小匹配数量min_good_match=10...
原创粉丝点击