關於在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");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM