您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-01 18:50 666 查看
在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
...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 文件读取