C++print打印与文件封装

其实是前面两篇文章的改进,我们也不多说了,print这个没点水平估计是看不懂

namespace show_ {
	template<typename T,size_t i>
	void print(const T(&n)[i], const std::string s=" ") {
		std::copy(std::begin(n),std::end(n), std::ostream_iterator<T, char>(std::cout, s.data()));
		std::cout << std::endl;
	}
	template<typename T,size_t size>
	void print(const std::array<T,size> v, const std::string s = " ") {
		std::copy(std::begin(v), std::end(v), std::ostream_iterator<T, char>(std::cout, s.data()));
		std::cout << std::endl;
	}
	void print(const char* s) {
		std::cout << s << std::endl;											//重载特殊情况,字符串常量输出
	}
	template<typename T>
	void print(const std::vector<T>n,const std::string s=" ") {
		std::copy(std::begin(n), std::end(n), std::ostream_iterator<T, char>(std::cout, s.data()));
		std::endl(std::cout);
	}
	template<typename T>
	void print(T v) {
		std::cout << v << std::endl;
	}
	template<typename T>
	void print(const std::list<T>& L,std::string s=" ") {
		for (auto it = L.begin(); it != L.end(); it++) {										//list容器版本
			std::cout << *it << s;
		}
		std::cout << std::endl;
	}
	template<typename _Type1, typename _Type2, typename... _Types>
	void print(_Type1 _Value1, _Type2 _Value2, _Types... _Values)//c++17折叠表达式
		requires (sizeof...(_Types) > 0 || (!std::is_same_v<char*, _Type2> && !std::is_same_v<const char*, _Type2>))//requires是c++20的
	{
		std::cout << _Value1 << ',' << _Value2 << ",";
		((std::cout << _Values ), ...);
	}
	namespace object {			//这真是无奈之举,这个匹配,object命名空间内的除了遍历vector和array的数组外,标准数据类型直接打印也可行
		template<typename T>
		std::ostream& operator<<(std::ostream& os, const std::vector<T>& data)
		{
			for (auto& str : data)
			{
				os << str;
			}
			return os;
		}
		template<typename T, size_t size>
		std::ostream& operator<<(std::ostream& os, const std::array<T, size>& data)
		{
			for (auto& str : data)
			{
				os << str<<",";
			}
			return os;
		}
		void print() {}
		template<typename T, typename...Types>
		void print(T first, Types...args) {
			std::cout << first << '\n';
			print(args...);
			return;
		}
	}
}

这是print,下面是测试的一部分代码

#include"func.h"
using namespace show_;//引入命名空间,所以写不写命名空间都行
int main()
{
	int n[10]{ 1,2,3,4,5,6,7,8,9,10 };
	std::vector<double>i{ 1.2,3,5,4,8,7,9,10,11,30.8 };
	std::cout << ::sort_::average(n, 0, 9) << std::endl;
	std::cout << ::sort_::sum(n, 0, 9) << std::endl;
	::sort_::Inverted(n, 0, 9);//逆置
	for (auto i : n)std::cout << i << ",";
	std::endl(std::cout);
	std::cout << ::maxAmin::max(i) << "," << ::maxAmin::max(n) << std::endl;
	std::cout << ::maxAmin::min(i) << "," << ::maxAmin::min(n) << std::endl;
	show_::print(n,",");
	show_::print(n);
	show_::print(i);
	show_::print(i,"*");
	show_::print(1, 2, 3, 4, 5, "666", "阿巴巴");
	std::endl(std::cout);
	print(1);
	show_::print("可怕");
	show_::print(5.7);
	const std::string str("离谱");
	show_::print(str);
	print(5);	
	print(std::move(12));
	show_::print(std::move(n));
	std::array<int, 5>v{ 1,2,3,4,5 };
	print(v);
	std::list<double>L{ 1.2,3.4,5.6,7.8,9,10,11,12 };
	print(L);
	print(L, ",");
	int a = 5;
	print(&a);
	size_t a2 = 10;
	print(a2);
	print("666666666", 5, 5.7, 8u);
	std::cout << std::endl;
	std::array<std::string, 1>a1{ "离谱" }, b1{ "6666" }, c1{ "阿巴巴" };//如果数组长度比初始化的长到时候就会一堆逗号
	std::vector<std::string>a3{ "离谱2" }, b2{ "66662" }, c2{ "阿巴巴2" };
	object::print(a1, b1, c1, 1000);	
	print("下面是测试");
	object::print(a1, b1, c1);
	object::print(a3, b2, c2, 66666);
	object::print(666666);
	object::print(n,"是吗","6666");
	object::print("66666", "离谱");
	std::array<int, 10>A{ 1,2,3,4,5,6,7,8,9,10 }, B{ 10,9,8,7,6,5,4,3,2,1 };
	std::vector<std::string>A1{ "离谱" }, B1{ "6666" }, C1{ "阿巴巴" };
	object::print("可以",A, B, 10);
	object::print(A1, B1, C1, 666);
	return 0;
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 能看懂就看吧,下面是文件的命名空间

namespace file_ {
	//获取当前时间的字符串
	std::string time_() {
		time_t timep;
		time(&timep);
		char tmp[256];
		strftime(tmp, sizeof(tmp), "%Y年%m月%d日_%H点%M分%S秒", localtime(&timep));
		std::string s{ tmp };
		return s;
	}
	//创建文件夹,默认在同级目录
	std::string newFolder(std::string name = time_(), std::string path = "") {
		std::string temp = "md ";
		temp += path;
		temp += name;
		//std::cout << "创建文件夹 " << temp << std::endl;
		system(temp.data());
		return temp.substr(3);
	}
	//删除文件夹
	std::string deleteFolber(std::string path) {
		std::string s = "rd ";
		system((s += path).data());
		return s.substr(3);
	}
	//以追加模式打开写文件
	std::string newWriteFile(std::string name = time_()+=".txt", std::string data = time_(), std::string path = "") {
		path += name;
		std::ofstream ofs;
		ofs.open(path, std::ios::app);
		ofs << data;
		ofs.close();
		return path;
	}
	//创建新的文件写入,一开始有就删除再创建
	void newlyFile(std::string name = time_(), std::string data = time_(), std::string path = "") {
		path += name;
		std::ofstream ofs;
		ofs.open(path, std::ios::trunc);
		ofs << data;
		ofs.close();
	}
	//删除文件的数据
	void deleteData(std::string name ,std::string path = "") {
		path += name;
		std::ofstream ofs(path, std::ios::trunc);
		ofs.close();
	}
	//删除文件
	bool deleteFile(std::string path) {
		if (remove(path.data()) == 0) {
			//std::cout << "删除成功" << std::endl;
			return true;
		}
		else {
			std::cout << "删除失败" << std::endl;
			return false;
		}
	}
	//读取文件
	std::string readFile(std::string path) {
		std::ifstream ifs;
		ifs.open(path, std::ios::in);
		if (!ifs.is_open())
		{
			std::cout << "文件打开失败" << std::endl;
			return "";
		}
		std::string data{};
		while (ifs >> data);
		ifs.close();
		return data;
	}
	//打印输出
	void print(std::string path) {
		show_::print(readFile(path));
	}
}

MSVC ,C++20,debug,明天见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值