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
请按任意键继续. . .
*/




目录
相关文章
|
5月前
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
2月前
|
Windows
DOS 批处理 setlocal命令、endlocal命令详解
DOS 批处理 setlocal命令、endlocal命令详解
58 10
|
2月前
|
Windows
DOS 批处理 setlocal命令、endlocal命令详解
setlocal这是一个命令,它开始局部化环境更改,通常在批处理文件中使用,以确保在脚本中所做的任何环境更改(例如设置或修改环境变量)不会影响到调用此批处理的上下文或其他批处理文件
114 14
|
3月前
|
Java Windows
JAVA 常用的 DOS 命令
【10月更文挑战第15天】DOS 命令是 Java 开发中不可或缺的工具,掌握这些命令可以提高开发效率和操作便利性。
49 3
|
4月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
5月前
|
监控 JavaScript 前端开发
JAVA常用的DOS命令
JAVA常用的DOS命令
|
5月前
|
Windows
基本的Dos命令 在控制台如何进入某一个文件或者进入不同的盘符
这篇文章介绍了如何在Windows DOS命令行环境中进入不同盘符和文件夹,包括使用Win+R快捷键打开运行窗口、通过输入盘符加冒号(如"D:")切换到指定盘符、使用"cd"命令进入文件夹,以及一些基本的文件操作命令如"dir"查看文件和"del"删除文件等。
基本的Dos命令 在控制台如何进入某一个文件或者进入不同的盘符
|
6月前
|
编解码 NoSQL Redis
c++开发redis module问题之想实现Redis命令,如何解决
c++开发redis module问题之想实现Redis命令,如何解决
|
6月前
|
NoSQL Java 编译器
c++开发redis module问题之保证Redis在fork时没有处于inflight状态的命令,如何解决
c++开发redis module问题之保证Redis在fork时没有处于inflight状态的命令,如何解决
|
5月前
|
关系型数据库 MySQL Java
收藏了许久的(快捷键指定):win系统的dos命令
本文收集了一系列Windows系统中的DOS命令快捷键和实用技巧,包括打开系统属性、运行窗口、文件管理、锁定桌面、查看系统信息、配置系统启动模式、系统服务管理、注册表编辑、共享路径访问、环境变量设置、端口查看、文件操作等,旨在提高用户在使用Windows系统时的效率和便利性。
72 0