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

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

#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");

时间: 2024-10-16 23:38:11

关于在C++中调用system函数的相关文章

Effective C++ Item 9 绝不在构造和析构过程中调用virtual函数

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层) 示例: <pre name="code" class="cpp">#include <iostream> #include <string> using namespace std; c

Effective C++ Item 09-绝不在构造函数和析构函数中调用virtual函数

Item 09-绝不在构造函数和析构函数中调用virtual函数(Never call virtual functions during construction or destruction) Why? 由于base class构造函数的执行更早于derived class构造函数,当base class构造函数执行derived class的成员变量尚未初始化.如果期间调用的virtual函数下降至derived class阶层,要知道derived class的函数几乎必然取用local成

在printf语句中调用day_name函数并把i值传送给形参n

本例中定义了一个指针型函数day_name,它的返回值指向一个字符串.该函数中定义了一个静态指针数组name.name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示.形参n表示与星期名所对应的整数.在主函数中,把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n.day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串"Illegal day".否则返回主函数输出对应

C中调用Lua函数

我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglobal(L, "f"); // 获取lua函数f lua_pushnumber(L, x); // 压入参数x和y lua_pushnumber(L, y); if(lua_pcall(L, 2, 1, 0) != 0) error(L, "error running functi

如何在C语言中调用Swift函数

在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中使用Objective-C中的类.在后半部分也介绍了如何在Swift中使用C函数,不过对于如何在C语言中使用Swift函数却只字未提.这里我就为大家分享一下如何在C语言中调用Swift函数. 我们首先要知道的是,所有Swift函数都属于闭包.其次,Swift函数的调用约定与Apple为Clang编译器贡献的B

Lua中调用C函数

Lua利用一个虚拟的堆栈来给C传递值或从C获取值.每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回值压入这个栈(Lua从中拿到C函数调用结果). 于此相关的C API有几个比较重要的定义如下: (1)typedef struct lua_State lua_State; lua虚拟机(或叫解释器),可以理解为一个thread,和一个完整的Lua虚拟环境的执行状态. (2)typedef int

Lua中调用C函数(lua-5.2.3)

Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性. 对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数. 对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L). 简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数.返回值是整型,表示该

EC笔记,第二部分:9.不在构造、析构函数中调用虚函数

9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #include <iostream> using namespace std; class cls1{ public: cls1(){ newMake(); }; ~cls1(){ deleteIt(); }; virtual void newMake(){ cout<<"cls1 make"<<endl; } virtual void deleteIt()

Effective C++ 条款九、十 绝不在构造和析构过程中调用virtual函数|令operator=返回一个reference to *this

  1.当在一个子类当中调用构造函数,其父类构造函数肯定先被调用.如果此时父类构造函数中有一个virtual函数,子类当中也有,肯定执行父类当中的virtual函数,而此时子类当中的成员变量并未被初始化,所以无法调用子类与之对应的函数.即为指向虚函数表的指针vptr没被初始化又怎么去调用派生类的virtual函数呢?析构函数也相同,派生类先于基类被析构,又如何去找派生类相应的虚函数? 2.做法:将子类的某个函数改为non-virtual,然后在子类构造函数中传递参数给父类函数.然后父类的构造函数