C++ 基础(读写/类型转换)

数据读写篇

#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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值