涉及C++的一些简单问题
1. 如何获取系统时间问题
2. 如何准确的为指针函数返回指针变量并在主函数调用
- &定义全局变量
- &利用new开辟新的内存空间地址
3. 使用string头文件进行简单的字符串拼接问题解决**
1.获取系统时间并将数字类型转换为字符串类型
利用C++标准头文件windows.h可以获取毫秒级的系统时间
构建系统时间变量即可获取系统时间
SYSTEMTIME sys;
GetLocalTime(&sys);
将系统时间类型由数字转换为字符串
- 可以先将其转换为流,然后再转换为字符串
stringstream ss; //定义流
string time_; //定义字符串类型时间
ss << sys.wYear;
ss >> time_;
源代码如下:
#include <iostream>
#include <windows.h>`
void main()
{
SYSTEMTIME sys;
GetLocalTime(&sys);
stringstream ss; //定义流
string time_; //定义字符串类型时间
//将数字类型变量转化为流,依次表示年/月/日/小时/分钟/秒/毫秒/周几
ss << sys.wYear << ":" << sys.wMonth
<< ":" << sys.wDay << ":" << sys.wHour
<< ":" << sys.wMinute << ":" << sys.wSecond
<< ":" << sys.wMilliseconds << ":" << sys.wDayOfWeek;
ss >> time_; //将流转化为字符串类型变量
cout << time_;
cin.get();
}
输出结果说明
输出结果:2019年10月7日12时41分40秒997毫秒周一
2.函数返回指针变量
之前我写了一个返回指针变量的函数,功能就是获取系统的时间并返回系统时间变量的内存地址,但是读取在主函数中获取的内存地址中的值,一直是空,原因是对于函数中的局部变量来说,其在函数结束时就没有了,所以会出现这种情况,那么如果我们一定想从函数中返回指针变量呢,那么有两种方法:
- 定义全局变量
- 利用new申请新空间
定义全局变量
- 全局变量的定义
string year; //定义全局变量year,因为如果定义在子函数中,当子函数进程执行完毕,该变量会消失
- 在子函数中定义指针并将指针指向全局变量:
string* year_;
year_ = &year; //将year_指针指向year变量
源代码如下
#include <iostream>
#include <windows.h>
using namespace std;
string* gettime(); //声明指针函数
//定义全局变量来返回指针函数变量
string year; //定义全局变量year,因为如果定义在子函数中,当子函数进程执行完毕,该变量会消失
int main()
{
string* year_;
year_ = gettime();
cout << "主函数中输出内存地址:" << year_ << endl;
cout << "主函数中市场及内存地址中值:" << *year_ << endl;
cin.get();;
return 0;
}
string* gettime()
{
SYSTEMTIME sys;
GetLocalTime(&sys);
stringstream ss;
string* year_;
ss << sys.wYear;
ss >> year;
year_ = &year; //将year_指针指向year变量
cout << "子函数中输出内存地址:" << year_ << endl;
cout << "子函数中市场及内存地址中值:" << *year_ << endl;
return year_; //返回内存地址指针
}
输出结果
利用new申请新空间
我们以获取系统时间年份为例:
- 声明指针函数
string* gettime();
- 在指针函数中new新空间,并将变量值放在新空间内
ss << sys.wYear;
ss >> year;
string *year_ = new string(year);
return year_;
源代码如下:
#include <iostream>
#include <windows.h>
using namespace std;
string* gettime(); //声明指针函数
int main()
{
string* year_;
year_ = gettime();
cout << "主函数中输出内存地址:" << year_ << endl;
cout << "主函数中市场及内存地址中值:" << *year_ << endl;
//delete year_string; //想取消新空间的话,直接delete即可
//cout << *year_ << "mmms";
cin.get();;
return 0;
}
string* gettime()
{
SYSTEMTIME sys;
GetLocalTime(&sys);
stringstream ss;
string year;
ss << sys.wYear;
ss >> year;
string *year_ = new string(year); //使用new申请新空间
cout << "子函数中输出内存地址:" << year_ << endl;
cout << "子函数中市场及内存地址中值:" << *year_ << endl;
return year_; //返回内存地址指针
}
输出结果:
3.字符串拼接重命名图像问题
因为想从获取系统时间来为照片命名,所以需要用到字符串拼接,之前看网上说的好复杂,其实只要使用+即可完成,感觉和python类似。
定义一个根路径字符串和后缀名字符串:
string head_path("E://5-MaterialPicture");
string suffix_name(".jpg");
opencv读取图片:
img = imread(head_path + "//xx.jpg", 0);
将获取的系统时间进行字符串拼接保存重命名后的图像:
imwrite(head_path + "//" + *year_ + "_xx" + suffix_name, img);
4.总的源代码:
该源代码实现了获取系统时间,并将系统时间为名称进行拼接重命名图像的功能。重命名后的的图像名称为2019_xx.jpg,可以将命名名称细化到毫秒级,那么每一次保存的图像都可以保证名称不同,从而不会产生覆盖现象。
#include <iostream>
#include <windows.h>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
string* gettime();
int main()
{
string head_path("E://5-MaterialPicture");
string suffix_name(".jpg");
string* year_;
year_ = gettime();
Mat img;
img = imread(head_path + "//xx.jpg", 0);
imwrite(head_path + "//" + *year_ + "_xx" + suffix_name, img);
imshow("ss", img);
waitKey(0);
return 0;
}
string* gettime()
{
SYSTEMTIME sys;
GetLocalTime(&sys);
stringstream ss;
string year;
ss << sys.wYear;
ss >> year;
string *year_ = new string(year);
return year_; //返回内存地址指针
}
2019.10.7
希望能帮到大家。