C++ 调用windows系统DOS命令的函数 system(char* command)

简介: C++ 调用windows系统DOS命令的函数 system(char* command)

除了我们经常用的system("pause");暂停命令外,还有以下这些功能也很不错:

system("title C++颜色设置程序"); //设置控制台窗口的标题,即cmd.exe的标题
system("mode con cols=48 lines=25"); //设置窗口宽度高度
system("date /t");  //显示日期
system("time /t");  //显示时间
system("shutdown -s -t 3600");  //延时关机  3600秒即一小时后关机
system("shutdown -a");  //取消延时关机
system("color 0B");  //设置文本和背景颜色


当然基本上所有的DOS命令当能被system()调用,下面主要说一下color命令的颜色设置,一共有16种颜色,编号0~15,由十六进制的0~F来指定。

E:\>color /?
设置默认的控制台前景和背景颜色。
COLOR [attr]
  attr        指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:
    0 = 黑色       8 = 灰色
    1 = 蓝色       9 = 淡蓝色
    2 = 绿色       A = 淡绿色
    3 = 浅绿色     B = 淡浅绿色
    4 = 红色       C = 淡红色
    5 = 紫色       D = 淡紫色
    6 = 黄色       E = 淡黄色
    7 = 白色       F = 亮白色
如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台窗口、/T 命令行开关或
DefaultColor 注册表值。
如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令
会将 ERRORLEVEL 设置为 1。
例如: "COLOR fc" 在亮白色上产生亮红色
E:\>


写一个遍历所有颜色的程序:

#include <iostream>
#include <ctime>
#include <iomanip>
#include <windows.h> 
using namespace std;
int main(void)
{
  char Color[9]="color ";
  for (int i=0;i<16;i++){
    for(int j=0;j<16;j++){
      Color[6]=(i>9?i-10:i)+(i>9?'A':'0');
      Color[7]=(j>9?j-10:j)+(j>9?'A':'0');
      system(Color);
      cout<<setw(4)<<(j|(i*16));
    }
    cout<<endl; 
  }
  system("color 0F");
  return 0;
}

运行中间过程:


20210130231030370.png


自定义函数systemColor(),color参数用两个10进制数代替:

#include <iostream>
#include <ctime>
#include <iomanip>
#include <windows.h> 
using namespace std;
void systemColor(unsigned short forecolor=15, unsigned short bgcolor=0)
{
  char Color[9]="color ";
  int i=bgcolor%16;
  int j=forecolor%16;
  Color[6]=(i>9?i-10:i)+(i>9?'A':'0');
  Color[7]=(j>9?j-10:j)+(j>9?'A':'0');
  system(Color);
}
int main(void)
{
  systemColor(14,1);  
  cout<<"title C++颜色设置程序"<<endl;
  return 0;
}

缺点:颜色设置范围是整个控制台窗口并非是指定输出文本,而且如果循环中多次调用运行速度偏慢。



设置文本颜色属性的优化


使用<windows.h>库函数SetConsoleTextAttribute()优化一下,定义函数用以设置控制台文本颜色属性,顺带引进一个设置光标位置的函数SetConsoleCursorPosition()。


SetConsoleTextAttribute()的颜色参数只用BLUE GREEN RED三原色,还有是否高亮INTENSITY,相当于三原色通过或运算来合成16种颜色的编号。这种配色方案记忆起来比较繁琐,还是用systemcolor的方法,用两个10进制数代替编号比较方便。


#include <iostream>
#include <ctime>
#include <iomanip>
#include <windows.h> 
using namespace std;
void setColor(unsigned short foreColor=15,unsigned short bgColor=0) 
{ //设置输出文本的前景色和背景色 
  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(hConsole, (foreColor%16)|((bgColor%16)*16));
}
void gotoXY(unsigned short x, unsigned short y)
{ //设置光标位置,坐标从左上角(0,0)起始 
    COORD position;
    position.X = x;
    position.Y = y;
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hConsole, position);
}
int main(void)
{
  SetConsoleTitle("程序执行时控制台的标题");  //相当于system("程序执行时控制台的标题"); 
  for (int i=0;i<16;i++){
    for(int j=0;j<16;j++){
      gotoXY(j*4,i);
      setColor(i,j);
      cout<<setw(4)<<(j|(i*16));
    }
  cout<<endl; 
  }
  setColor();
  return 0;
}


运行结果如下:

20210131000207686.png




颜色编号的或运算


前景色背景色各16种,相互叠加一共256种颜色搭配方案。前、背景颜色是通过按位或 “|” 运算求得的,背景色前景色编号都是0~15,对应4位的二进制数0000~1111,所以背景色编号需要乘以16,成为8位的二进制数。比如 setColor(14,1),14=1110,14*16=1110 0000,相当于背景色移到高四位而低四位全为0,前景色不变它的高四位全为0。这样处理后变成2个8位二进制数按位求或:1110 0000 | 0000 0001 = 1110 0001,结果为225。与上面的颜色表截图对比,225代表蓝色背景淡黄色前景。



位运算符

位运算除了或运算 |,还有:与运算 &、异或 ^ 、求反 ~、右位移 >>、左位移 <<


异或 ^ ,两数对应位上相反为真,相同为假。 总有:a^0=a, a^b^b=a  ==>对调两数: int x=1,y=2; y=x^y; x=x^y; y=x^y; 注意大数的溢出

右位移 >> 一个数每右移一位相当于被整除2; 左位移 >> 每左移一位相当于乘以2,注意有溢出另算。


<<=    左移且赋值运算符    C <<= 2 等同于 C = C << 2

>>=    右移且赋值运算符    C >>= 2 等同于 C = C >> 2

|=       按位或且赋值运算符    C |= 2 等同于 C = C | 2

&=     按位与且赋值运算符    C &= 2 等同于 C = C & 2

^=      按位异或且赋值运算符    C ^= 2 等同于 C = C ^ 2

注意:没有~=




#include <iostream>
using namespace std;
int main(void)
{
  int i=25;  // 0001 1001 
  int j=12;  // 0000 1100 
  cout << (i|j) <<endl;  //或运算:0001 1101 = 29 
  cout << (i&j) <<endl;  //与运算:0000 1000 = 8 
  cout << (i^j) <<endl;  //异或运算: 0001 0101 = 21 
  cout << (i<<3) <<endl; //向左移3位: 1100 1000 = 200
  cout << (i>>2) <<endl; //向右移2位: 0000 0110 = 6
  cout << (~i) <<endl;   //求反运算: 整数共32位,后8位:1110 0110
  //计算机中整型数是以32位二进制补码形式存储的,补码等于反码+1。
  //求反把最高的符号位也反了,所以不论正负都有整数n求反:~n=-(n+1)
  return 0;
}
/*
运算结果:
29
8
21
200
6
-26
--------------------------------
Process exited after 1.833 seconds with return value 0
请按任意键继续. . .
*/




目录
相关文章
|
7天前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
41 11
|
6月前
|
存储 算法 C++
Windows共享文件:探秘C++实现的B树索引算法奇境
在数字化时代,Windows共享文件的高效管理至关重要。B树算法以其自平衡多路搜索特性,在文件索引与存储优化中表现出色。本文探讨B树在Windows共享文件中的应用,通过C++实现具体代码,展示其构建文件索引、优化数据存储的能力,提升文件检索效率。B树通过减少磁盘I/O操作,确保查询高效,为企业和个人提供流畅的文件共享体验。
|
5月前
|
消息中间件 NoSQL Linux
Redis的基本介绍和安装方式(包括Linux和Windows版本),以及常用命令的演示
Redis(Remote Dictionary Server)是一个高性能的开源键值存储数据库。它支持字符串、列表、散列、集合等多种数据类型,具有持久化、发布/订阅等高级功能。由于其出色的性能和广泛的使用场景,Redis在应用程序中常作为高速缓存、消息队列等用途。
880 16
|
6月前
|
存储 监控 数据中心
Microsoft System Center 2025 version 2503 Multilanguage - Windows 服务器管理软件
Microsoft System Center 2025 version 2503 Multilanguage - Windows 服务器管理软件
164 0
|
9月前
|
网络协议 数据建模 数据安全/隐私保护
网安快速入门之Windows命令
本文简要介绍了Windows命令行中常用的11个命令,帮助快速入门网络安全和系统管理。这些命令包括:`help`(获取命令帮助)、`copy`(复制文件)、`dir`(显示目录内容)、`cd`(更改当前目录)、`type`(显示文本文件内容)、`del`(删除文件)、`ipconfig`(查看网络配置)、`net`(用户和组管理)、`netstat`(显示网络连接)、`tasklist`(显示进程信息)和`sc`(服务控制)。每个命令都有其特定用途,掌握它们可以大大提高工作效率和系统维护能力。
|
11月前
|
存储 安全 数据库
适用于 Windows 的管理命令
以下命令可用于管理 Rational® Synergy。
116 1
|
12月前
|
人工智能 监控 安全
掌握Windows管理利器:WMI命令实战
本文介绍了Windows Management Instrumentation (WMI) 的基本概念和用途,通过多个实用的`wmic`命令示例,如获取CPU信息、查看操作系统详情、管理服务、检查磁盘空间等,展示了WMI在系统维护中的强大功能。适合IT专业人士学习和参考。
689 4
|
Windows
Windows系统命令dir使用详解
Windows系统命令dir使用详解
1424 2
|
缓存 监控 网络协议
计算机网络的常用的网络通信命令(Windows)
本文介绍了网络技术中常用的命令,如ping用于检测网络连通性,ipconfig查看TCP/IP配置,netstat监控网络状态,arp显示和修改ARP缓存,at安排任务执行,tracert追踪路由,以及nbtstat获取NetBIOS信息。
221 1
|
监控 网络安全 Windows
Windows系统命令
Windows系统命令
159 1