C++:获取系统时间、将数字转换为字符串类型、函数返回指针变量(全局变量定义&new申请新空间)、字符串拼接重命名图像问题解决


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
希望能帮到大家。


猜你喜欢

转载自blog.csdn.net/jsk_learner/article/details/102225038