先看看下面的這一段程序:
#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");