数据读写篇
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("filepath.txt");
string line_info,input_result;
vector<string> vectorString;
if(fin) // 有该文件
{
while (getline (fin, line_info)) // line中不包括每行的换行符
{
stringstream input(line_info);
//依次输出到input_result中,并存入vectorString中
cout<<"line_info: "<<line_info<<endl;
while(input>>input_result)
vectorString.push_back(input_result);
for(int j=0;j<vectorString.size();j++){
cout<<vectorString[j]<<endl;
}
}
}
else // 没有该文件
{
cout<<"no such file"<<endl;;
}
vector<int> * load_modeloutput(string txtfile, HobotCheckFaceImageFeatures *faceimgfeats)
{
ifstream fin(txtfile);
string line_info,input_result;
vector<string> vectorString;
if(fin) // 有该文件
{
int face_num = 0;
HobotCheckFaceFeature facefeat;
while (getline (fin, line_info)) // line中不包括每行的换行符
{
stringstream input(line_info);
//依次输出到input_result中,并存入vectorString中
// cout<<"line_info: "<<line_info<<endl;
while(input>>input_result)
vectorString.push_back(input_result);
// image_path rects lmks1 lmks2_attr pose1 quality
// cout<<"line len :" <<vectorString.size()<<endl;
assert(vectorString.size() == 15);
for(int j=0;j<vectorString.size();j++)
{
if (vectorString.size() == 15)
{
if (j==0)
{
// cout<<vectorString[0]<<endl;
facefeat.face_imgpath_.push_back(vectorString[j]);
}
else
{
// cout<<stringToNum<float>(vectorString[j])<<endl;
// if (j >= 1 && j<=6)
// {
// facefeat.face_rect_.push_back(vectorString[j]);
// }
// else if (j>=7 && j<=11)
// {
// facefeat.landmark_attr_.push_back(vectorString[j]);
// }
// else if (j>=12 && j<=14)
// {
// facefeat.pose_.push_back(vectorString[j]);
// }
// else if (j == 15)
// {
// facefeat.quality_score_.push_back(vectorString[j]);
// }
facefeat.face_attr.push_back(stringToNum<float>(vectorString[j]));
}
facefeat.face_id_num = 1;
}
else
{
for(int ids=0; ids != vectorString.size()/15; ids++)
{
if (j%vectorString.size() == 0)
{
// cout<<vectorString[0]<<endl;
facefeat.face_imgpath_.push_back(vectorString[j]);
}
else
{
facefeat.face_attr.push_back(stringToNum<float>(vectorString[j]));
}
}
facefeat.face_id_num = vectorString.size()/15;
}
}
vectorString.clear();
(*faceimgfeats).features_.push_back(facefeat);
facefeat.face_imgpath_.clear();
facefeat.face_attr.clear();
face_num += 1;
}
(*faceimgfeats).features_count_= face_num;
// cout<<"feats num: "<< (*faceimgfeats).features_count_<<endl;
// cout<<"feats size: "<< (*faceimgfeats).features_.size()<<endl;
}
else // 没有该文件
{
cout<<"no such file"<<endl;;
}
return 0;
}
数值转换篇
1 数值类型转换为string
1.1使用函数模板+ostringstream
//ostringstream对象用来进行格式化的输出,常用于将各种类型转换为string类型
//ostringstream只支持<<操作符
template<typename T> string toString(const T& t){
ostringstream oss; //创建一个格式化输出流
oss<<t; //把值传递如流中
return oss.str();
}
cout<<toString(14.2)<<endl; //实型->string:输出14.2
cout<<toString(12301)<<endl; //整型->string:输出12301
cout<<toString(123456789785)<<endl;//长整型->string:输出123456789785
cout<<toString(true)<<endl; //布尔型->string:输出1
1.2使用标准库函数std::to_string()
std命令空间下有一个C++标准库函数std::to_string(),可用于将数值类型转换为string。使用时需要include头文件。
函数原型申明如下:
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
2 string转换为数值类型
2.1使用函数模板+ istringstream
stringstream在int或float类型转换为string类型的方法中已经介绍过, 这里也能用作将string类型转换为常用的数值类型。
#include <iostream>
#include <sstream> //使用stringstream需要引入这个头文件
using namespace std;
//模板函数:将string类型变量转换为常用的数值类型(此方法具有普遍适用性)
template <class Type>
Type stringToNum(const string& str){
istringstream iss(str);
Type num;
iss >> num;
return num;
}
int main(int argc, char* argv[]) {
string str("00801");
cout << stringToNum<int>(str) << endl;
system("pause");
return 0;
}
2.2使用C标准库函数
(1)string转换为int32_t
atoi(): int atoi ( const char * str );
说明:Parses the C string str interpreting its content as an integral number, which is returned as an int value.
参数:str : C string beginning with the representation of an integral number.
返回值:1. 成功转换显示一个Int类型的值. 2. 不可转换的字符串返回0. 3.如果转换后缓冲区溢出,返回 INT_MAX orINT_MIN
string love="77";
int ilove=atoi(love.c_str());
//或者16位平台转换为long int
int ilove=strtol(love.c_str(),NULL,10);
(2)string转换为uint32_t
//str:待转换字符串
//endptr:指向str中数字后第一个非数字字符
//base:转换基数(进制),范围从2至36
unsigned long int strtoul (const char* str, char** endptr, int base);
#示例
string love="77";
unsigned long ul;
ul = strtoul(love.c_str(), NULL, 10);
(3)string转换为uint64_t
string love="77";
long long llLove=atoll(love.c_str());
(4)string转换为uint64_t
unsigned long long int strtoull (const char* str, char** endptr, int base);
#示例
string love="77";
unsigned long long ull;
ull = strtoull (love.c_str(), NULL, 0);
(5)string转换为float或double
// atof(): double atof ( const char * str );
// 参数:C string beginning with the representation of a floating-point number.
// 返回值:1. 转换成功返回doublel类型的值 2.不能转换,返回0.0。 3.越界,返回HUGE_VAL
string love="77.77";
float fLove=atof(love.c_str());
double dLove=atof(love.c_str());
(6)string转换为long double
long double strtold (const char* str, char** endptr);
2.3使用C++标准库函数
使用C++11引入的C++库函数将string转换为数值类型,相应的库函数申明于头文件中。
形参说明:
str:重载了string和wstring版本,表示被转换的字符串。
idx:表示一个size_t*的指针类型,默认为空值。不为空时,转换成功时获取第一个非数值字符的下标。一般情况下,因为它是直接char型指针把最后非数值字符的地址值和起始地址值相减,所以也表示成功转换的字符数量,如”10”转成功为数值10时,*idx的值为2。
base:表示转换基准,默认是10进制。
C++ string格式化输出方式
#include <boost/format.hpp>
boost::format f = boost::format("%.2f %s %d") % 1.234 %"123" % 12;
std::string s = f.str();
// 等同于
boost::format f = boost::format("%.2f %s %d");
f % 1.234 %"123" % 12;
std::string s = f.str();
format占位符的使用
std::cout<<boost::format("%1% \n %2% \n %3%" )%"first"%"second"%"third";
//将会输出
second
first
third
format的交互形式
// 我们还可以很方便的把格式化后的实例赋给std::string,如:
boost::format fmt("%1%")%"helloworld";
std::string st=fmt.str();
format格式化
格式化语法为: [ N$ ] [ flags ] [ width ] [ . precision ] type-char
有两种版本:C语言和.net版本,我这里就复制粘贴了一段
//传统c语言风格
cout << boost::format("\n\n%s"
"%1t 十进制 = [%d]\n"
"%1t 格式化的十进制 = [%5d]\n"
"%1t 格式化十进制,前补'0' = [%05d]\n"
"%1t 十六进制 = [%x]\n"
"%1t 八进制 = [%o]\n"
"%1t 浮点 = [%f]\n"
"%1t 格式化的浮点 = [%3.3f]\n"
"%1t 科学计数 = [%e]\n"
) % "example :\n" % 15 % 15 % 15 % 15 % 15 % 15.01 % 15.01 % 15.01 << endl;
//.net的风格
cout << boost::format("%1%"
"%1t 十进制 = [%2$d]\n"
"%1t 格式化的十进制 = [%2$5d]\n"
"%1t 格式化十进制,前补'0' = [%2$05d]\n"
"%1t 十六进制 = [%2$x]\n"
"%1t 八进制 = [%2$o]\n"
"%1t 浮点 = [%3$f]\n"
"%1t 格式化的浮点 = [%3$3.3f]\n"
"%1t 科学计数 = [%3$e]\n"
) % "example :\n" % 15 % 15.01 << endl;