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




目录
相关文章
|
6月前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
259 11
|
12月前
|
存储 算法 C++
Windows共享文件:探秘C++实现的B树索引算法奇境
在数字化时代,Windows共享文件的高效管理至关重要。B树算法以其自平衡多路搜索特性,在文件索引与存储优化中表现出色。本文探讨B树在Windows共享文件中的应用,通过C++实现具体代码,展示其构建文件索引、优化数据存储的能力,提升文件检索效率。B树通过减少磁盘I/O操作,确保查询高效,为企业和个人提供流畅的文件共享体验。
|
8月前
|
算法 安全 网络安全
【多智能体系统】遭受DoS攻击的网络物理多智能体系统的弹性模型预测控制MPC研究(Simulink仿真实现)
【多智能体系统】遭受DoS攻击的网络物理多智能体系统的弹性模型预测控制MPC研究(Simulink仿真实现)
305 0
|
10月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
250 0
|
存储 监控 算法
员工屏幕监控系统之 C++ 图像差分算法
在现代企业管理中,员工屏幕监控系统至关重要。本文探讨了其中常用的图像差分算法,该算法通过比较相邻两帧图像的像素差异,检测屏幕内容变化,如应用程序切换等。文中提供了C++实现代码,并介绍了其在实时监控、异常行为检测和数据压缩等方面的应用,展示了其实现简单、效率高的特点。
484 15
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
827 6
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
程序员 调度 开发工具
DOS系统
【10月更文挑战第15天】DOS系统
1124 3
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
747 6
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
384 0
C++ 多线程之线程管理函数