关于在C++中调用system函数

时间:2022-09-22 09:12:07

先看看下面的这一段程序:

#include <iostream>

#include <cstdlib>

int main(int argc, char* argv[])

{

 std::cout << "Hello world!" << std::endl;

 std::system("pause");     //让程序暂停

  return 0;

}

然后呢,再来讲几段背景知识。

背景知识1:字符界面

话说十几二十年前,一个个青春焕发、英俊潇洒、斗志昂扬的coder坐在学校机房里286电脑面前时,那电脑屏幕就是一个黑黑框,那时使用的操作系统叫DOS,后来,有个同学有钱,买了台386,上面运行的操作系统是Windows 3.1;人家说,那就是传说中的“图形用户界面”操作系统,简称“GUI”操作系统。

如此,操作系统就有“字符用户界面”和“图形用户界面”之分。

背景知识2:控制台

在图形用户界面的操作系统里,往往都带了一个模拟的“字符界面”小系统,用来让低级用户直接输入控制命令,以实现和系统交互,这就叫做“控制台”。因此,严格地说,“控制台”并不是DOS操作系统,因为它只是在图形用户界面的操作系统模拟出来的、内嵌的一个“字符界面”小系统,并不能单独存在。

通过点击“开始”按钮,找到开始菜单里的“运行(R)……”菜单项,点击,输入cmd,按回车键,或点击“确定”按钮,就可以看到一个黑黑的窗口了。如此,便打开了那听起来挺玄乎的控制台。

背景知识3:低级与高级

或许你会问:“低级用户直接在控制台里输入控制命令,以实现和系统交互,那么,高级用户呢?

嗯!这个问题问得好。这里的“低级”仅仅是说有些用户对操作系统有更深的了解,从而可以使用到一些相对“底层”些的功能,事实上所有用户都是平等的。“高级”用户就是用键盘等设备,特别是鼠标来和图形界面的操作系统进行交互。比如,每个人都会通过鼠标拖动,来实现移动某个文件从一个文件到另一个文件夹,是吧?有不会的?先去把Windows基本操作学好了再来学编程吧。

在计算机的术语里,“低级”往往表示接近底层逻辑,比如硬件。因此,“低级”往往表示一种“困难”。比如,我们学的C++称为“高级语言”(Java或C#更高级些),C则可以称为是“中级语言”,而汇编语言称为“低级语言”,但大家要知道,汇编语言很难的噢。

 

下面开始转入正题了:system 函数

要调用该函数,必须在前面包含:#include <cstdlib>

重复一下:c表示这个函数在C语言里也是通用的,std表示标准(当然是C的标准噢),lib表示“库”。即C语言里的标准库。那么system就是一个C语言标准库里的标准函数了。

system函数可以执行你发出的控制台命令。当然,得用英文的双引号将命令括起来,以表示一句话。不过,你也可以直接在控制台输入这个命令,当然,那时就不用引号了。前面我们已经学会如何通过“运行”命令来搞出一个控制台窗口,现在你只需在那个窗口里输入pause试试。

最后我说一句,和控制台相关的函数或代码,一般无法在“图形用户界面”里使用。

例题:编一程序,实现几个简单的DOS功能,包括:mtype、mcopy、mcomp等。

mtype 实现DOS的type功能,显示.TXT文件的内容

mcopy 实现DOS的copy功能,复制一个任意格式的磁盘文件。

mcomp 实现DOS的comp功能,比较二个任意格式的磁盘文件,从长度、内容二个方面。

注意用带参数的main函数。

思路:通过main函数的参数构造命令字符串,然后用system函数调用执行。

int main(int argc,char **argv){ …… } 

――――――――――――――――――――――――――――

作业:

1、将system("pause")中的“pause”一词,改为“Pause”,试试控制台命令是否区分大小写?

2、在system("pause")之前,插入一行:std::system("dir");   编译,执行,看看是什么结果?

――――――――――――――――――――――――――――

读者提问:我在主程序段中输入以下代码

system("d:\dir");

system("dir d:");

system("ping xxx.xxx.xxx.xxx");

system("copy d:\1.txt e:\2.txt");

输出都没有反应呢,程序运行也没有报错。该包含的文件都包含了,书写的格式都没有错,应该有反映的吧?谢谢回复!!

问题补充:那么怎样才能看到效果呢?比如想看到D盘下文件的列表,像在MS-DOS下运行命令一样。另外,最后的那个copy也没有执行,盘内确实是有这么一个文件的。

 

回复:编译程序不会检查你的输入参数字符串,所以就算你的参数(字符串)写错了,它也肯定不会报错。你的这几个调用都是独立的,实际上操作是执行了,只是你看不到。 唯一能看到效果的应该是最后一个吧,如果文件存在的话,应该可以拷贝成功的。如果想感性地看到其他几条指令的效果,不妨在最后加上一句:system("pause")

回答:我不是很理解你的意思,所以我按我的理解去说吧。

你要明白,system()函数针对的是DOS界面的操作,即调用DOS命令库中的命令来完成相关操作,所以一般只能处理一些信息并在DOS界面上显示,而很少用于提取信息。

如果你想在DOS下查看某个文件夹的内容,可用dir命令;具体到system()函数可这么写:

……

system("dir [路径名]");

……

其中路径名为可选项,即如果是当前目录的话就可以忽略。但要注意,写路径时,'\'要用'\\'来表示,因为这是C语言的转义字符。如要指明C:\abc,则应这样写:

system("dir C:\\abc");