一直都在用C/C++,但用的都是库,像什么opencv啊,gdal啊,cuda啊等等。我们做的事情很多都只是调用它们的API,反而C/C++自身的库用得少了,很多基本的都忘记了。就像我们走得太快灵魂跟不上一样。有时候我们得停下脚步等等自己的灵魂。
下面是今天项目中用到的一些基本函数:
首先是写了一个分隔字符串的函数,给定一个字符串和一个字符,将字符串分隔成多个段,这个功能在C#和python等语言中是字符串类型的一个自带的方法,但是在C++的字符串中没有提供,要自己实现,代码如下:
vector<string> split(const string &source, char separator)
{
vector<string> components;
size_t startPos=0;
size_t findPos=0;
size_t strLen=source.length();
while (startPos<strLen)
{
findPos=source.find_first_of(separator,startPos);
if (findPos==-1)
{
string sunStr=source.substr(startPos);
if (!isAllBlank(sunStr))
{
components.push_back(sunStr);
}
break;
}
else
{
size_t len=findPos-startPos;
if(len==0)
{
startPos=findPos+1;
continue;
}
else
{
string sunStr=source.substr(startPos,len);
startPos=findPos+1;
if (isAllBlank(sunStr))
{
continue;
}
components.push_back(sunStr);
}
}
}
return components;
}
上面有一个判断是不是都是空格的函数isAllBlank(sunStr),因为我们的项目中不需要全为空格的项所以舍去,这个函数的实现如下:
bool isAllBlank(const string &source)
{
basic_string <char>::size_type findIndex = source.find_first_not_of(" ");
if (findIndex == string::npos)
{
return true;
}
return false;
}
经过测试上面的代码还是比较稳定的。
下面是文字对齐的方法,因为要输出一个浮点型的矩阵到一个文本文件中,由于浮点数参差不齐,为了好看我们将它输出的时候进行对齐。首先我们要确定输出的浮点型的有效位数,比如我们的有效位数是12那我们可以像下面这样先将浮点数转换为字符串:
char numbuffer[32];
gcvt(values[c], 12, numbuffer);
之后我们在用下面的代码将字符串输出并进行20个字符的对齐:
fprintf(pStream, "%20s",numbuffer);
上面是右对齐,如果是想左对齐可以将格式字符串改为"%-20s" ,加一个负号就可以了。
有人说上面的太复杂,直接用下面的代码一句就可以了:
fprintf(pStream,"%9.5f",value);
但是这样的话如果我们的数字超过了14位,它就会不对齐了,因为他不会截断,而我们用gcvt函数的话如果数字太长,它会帮我们用科学计数法表示,这样我们输出的内容就肯定是对齐的了。