程序
getline读取
string filename = "../Config/params.txt";
fstream fin;
fin.open(filename.c_str(), ios::in);
// vector<string> v;
vector<float> v_f;
string tmp;
while (getline(fin, tmp))
{
line_process(tmp);
if (tmp.empty()) continue;
// v.push_back(tmp);
v_f.push_back(atof(tmp.c_str()));
}
处理
参考:javascript:void(0)
//处理注释,空格,和空行的函数
//line,表示一行文本内容
//comment_str,表示注释前导字符串,默认设置为#,也可以用//或者%
void line_process(std::string &line, const std::string comment_str = "#")
{
for (char &c : line)//C++11以上版本的语法
{
//制表符 tab,逗号,分号都当作有效的分隔符,统一转成空格
//为了避免错误,回车符和换行符也转为空格(否则无法处理空行)
if (c == '\t' || c == ',' || c == ';' || c == '\r' || c == '\n')
c = ' ';
}
line.erase(0, line.find_first_not_of(" "));//删除行首空格
line.erase(line.find_last_not_of(" ") + 1);//删除行末空格
//查找注释符所在位置,如果不存在,则得到string::npos
int n_comment_start = line.find_first_of(comment_str);
if (n_comment_start != std::string::npos)//这一句必须的
line.erase(n_comment_start); //删除注释
//处理完毕。如果这一行只有空格,制表符 tab,注释,那么处理后line为空;
//如果行首有多个空格(或者空格和tab交错),行尾为注释,那么处理后字符串line的
//行首多个空格(和tab)和行尾注释被删掉,只保留有意义的内容。
}
例子
有文件如下
1.2 #sensor_height_
1 #num_seg_
2 # 迭代次数
20 # num_lpr_
0.2 # th_seeds_
0.3 # th_dist_
读取之后,如下
➜ build git:(master) ✗ ./read_txt
1.2
1
2
20
0.2
0.3
➜ build git:(master) ✗