控制檯與wchar_t

c++中wchar_t與char轉換

sizeof( wchar ) = 2
sizoef( char ) = 1

環境:Dev cpp 平臺i386
C++達標中,wchar_t是寬字符類別,每個wchar_t類別佔2個字節,16位寬。漢字的表明就要用到wchar_t 。char,咱們都明白,佔唯一字節,8位寬。其實明白了那個以後,要在wchar_t 和 char兩種類別之間轉換就不難呈現了。
wchar_t 轉換爲char 的代碼Code如下:
有如下的wchar_t和char變量
wchar_t w_cn = '中';
char c_cn[2] = {'0'} ;
char *C2W(wchar_t w_cn , char c_cn[2])
{
//following code convert wchar to char
c_cn[0] = w_cn >> 8 ;
c_cn[1] = w_cn ;
c_cn[2] = '/0';
return c_cn ;
}
其中需求留意的是唯一16位的wchar_t需求用兩個8位的char來存儲之。咱們能夠發明另外唯一疑難問題,wchar_t的高位字節因該存儲在char數組的低位字節。(那裏沒有仔細研究了,覺得怪怪的)。
這是完成了wchar_t到char的轉化,char到wchar_t的轉換類似。
C++中,你要想那樣:cout< string cn(c_cn);
cout<那樣就能正確的打印wchar_t字符了。是否則感覺好像做了好多事,但是完成的卻是很簡單的事件?呵呵,其實我也有同感,但是沒有辦法。更簡單的辦法,當然是直接用API(我唯一是懶的去找了,二唯一自個動手轉換有些物品看的更清楚咯),但是那樣的轉換更靈活,在實際中因該會用到的。
有了以上的基本,下面給出wchar_t字符串到char字符串的轉換代碼Code:
char *W2C(const wchar_t *pw , char *pc)
{
//cout<<*pw< *pc++ = *pw >> 8 ;
*pc = *pw ;
return 0 ;
}

char *wstr2cstr(const wchar_t *pwstr , char *pcstr, size_t len)
{
char *ptemp = pcstr ;
if(pwstr!=NULL && pcstr!=NULL)
{

size_t wstr_len = wcslen(pwstr) ;
len = (len > wstr_len ) ? wstr_len : len ;
while( len -- > 0)
{
W2C(pwstr , pcstr);
pwstr++ ;
pcstr +=2 ; //和咱們開端說的相同+2,否則+1
}
*pcstr = '/0';
return ptemp ;
}
return 0 ;
}
上面就代碼Code,測試:
int main(int arg , char *argv[])
{
wchar_t pwstr[] = {'我' , '是' , '中' , '國' , '人'};

char *pcstr = (char *)new char[2 * wcslen(pwstr)+1] ;
memset(pcstr , 0 , 2 * wcslen(pwstr)+1 );
wstr2cstr(pwstr , pcstr , wcslen(pwstr)) ;
str.assign (pcstr);
cout< delete []pcstr ;
}

wchar_t


  wchar_t是C/C++的字符數據類型,char是8位字符類型,最多隻能包含256種字符,許多外文字符集所含的字符數目超過256個,char型無法表示。
 
  wchar_t數據類型一般爲16位或32位,但不同的C或C++庫有不同的規定,如GNU Libc規定wchar_t爲32位[1],總之,wchar_t所能表示的字符數遠超char型。
 
  標準C++中的wprintf()函數以及iostream類庫中的類和對象能提供wchar_t寬字符類型的相關操作。
 
  例如:
 
  #include <iostream>
 
  using namespace std;
 
  void main()
 
  {
 
  locale loc( "chs" );//定義“區域設置”爲中文方式
 
  wcout.imbue( loc );//載入中文字符輸入方式
 
  wchar_t str[]=L"中國";//定義寬字符數組,注意L是大寫
 
  wcout<<str<<endl;//顯示寬字符數組,下同
 
  wprintf(str);
 
  system("pause");
 

  }

控制檯



 

 
  
 

概述   存放管理工具的框架,例如 Microsoft 管理控制檯 (MMC)。控制檯是由控制檯樹中的項定義的,可能包括文件夾和其他容器、**網頁和其他管理項。控制檯帶有窗口,這些窗口能提供控制檯樹視圖和由控制檯樹中的項引發的管理屬性、服務及事件的視圖。
 

控制檯概念   產品概念:
 
  面對越來越多的智能化管理,而衆多的儀器設備、錯綜複雜的線路已擠滿了整個工作室,使管理人員無法工作。控制檯是一種專爲監控室內擺放設備及理清線路的機殼設備。
 
  一.控制檯又名:操作檯、工作臺、監控臺、監控工作臺、監控操作檯、平臺式操作檯等。
 
  二.適用於:生活小區保安室、公安監控室、道路監控室、大廈監控室、街道監控室、學校監控室、旅遊景區監控室、工廠監控室等。
 
  三.可放置設備:顯示器(臺式、液晶)、電腦主機(立、臥式)、鍵盤、手搖操作鍵盤、畫面分割器、19″其它設備、報警盒、對講主機等。顯示器通常爲17″。
 

特點

1.控制檯是一種特殊的產品

  可以根據客戶的使用需求而訂製。它可以單聯使用,也可以是多聯組合使用。可以單層(每個顯示器爲一層,兩個顯示器疊壘爲兩層)使用,也可以多層使用;

2.它一般以聯或位爲單位

  通常(單層)每聯或每位常規尺寸爲1150(高)*565(寬)*1000(深)毫米(平臺式高度爲750毫米)。此尺寸內部爲19″標準櫃體,可放置19″以下任意設備;

3.設計原理

  整個櫃體採用的1.2毫米~2.0毫米SPCC鋼板經裁剪、衝壓、折彎、鉚接、焊接、打磨、校形、除油、除鏽、磷化、靜電噴塗、高溫固化、冷卻等製作而成。產品可分爲組裝式和焊接式兩種。組裝式加工難度高但運輸成本低,焊接式加工難度低但運輸成本高。①檯面高度爲700毫米,深底爲350毫米。適合操作員在坐姿操作時雙腿能伸入檯面下部且不會因爲碰到櫃體而傷到腿;②檯面配有推拉式鍵盤抽屜,預留有鼠標線孔。有利於操作檯面的井然有序;③每聯櫃體後上部配有交流散熱風扇一套(風扇、風扇罩、1米電源線,已組裝好),後門(可鎖)預留有散熱通風孔。有利於櫃體內部產生循環風而達到散熱功能,後門便於檢修櫃體內的設備;④櫃體下部(底板後部與下部)預留有進出線孔位便於走線;⑤櫃體下部配有可調節層板一件,轉動前門(可鎖)。層板便於放置臥式主機或其它設備,前門便於打開操作設備;⑥整個櫃體爲一把鑰匙打開;⑦櫃體上部(平臺式除外)首層爲傾斜面,與檯面夾角爲105度,從第二層起與檯面夾角爲90度。有利於操作員在長時間目視畫面時眼睛不疲勞;⑧櫃體上部(平臺式除外)配有可調節顯示器層板一件,可拆卸活動前面板一件。前面板有利於更換顯示器時不用更換櫃體而只更換面板;⑨檯面與櫃體爲組合式(平臺式除外)更有利於運輸;⑩顏色任意搭配(通常爲電腦灰),使整個櫃體實用美觀。

控制檯應用程序與Windows應用程序

 
       Q:我見到過一些即可以作爲控制檯應用程序運行,也可以作爲基於Windows的應用程序運行的程序。即:如果你在命令提示符鍵入程序的名字,它就會作爲一個普通的基於 Windows 的應用程序運行;如果你輸入一個命令行選項,如:“-batch”,它就會以批處理模式作爲一個控制檯應用程序運行,同時所有輸出被定向到控制檯。請問這個功能是怎麼做的?
Joe Tadmann
      A: 我沒法告訴你其它的應用程序是怎麼這樣做的,因爲在 Window 中,總是有多種方法來給操作系統加殼,但是我可以向你展示實現這種功能的一種途徑---通過 Visual Studio.NET 來實現。也許你沒有注意到,你可以在命令提示符鍵入 devenv 來啓動 Visual Studio .NET,這時,Windows 啓動 其圖形用戶界面。但是如果你鍵入 devenv 的同時再加上一個命令行開關,例如,-? 表示幫助,-bulid 表示編譯並生成你的工程,它將以控制檯模式運行,沒有用戶交互界面。例如:
devenv -build MyProject.sln
上面這行命令生成解決方案文件 MyProject.sln。

  遺憾的是,自從GUI(圖形用戶界面)出現以後,太多的程序員已經忘了命令行的強大功能,這些強大的命令行功能使用戶能以批處理模式從腳本中運行你的應用程序。你可以 確信微軟的那幫傢伙是不會在 Visual Studio 中打開某個工程來生成他們的產品的!如果你寫了一個確實能實現某些功能的程序,比如,把.wav文件轉換成.mp3,或者通過計算預測股票, 這些功能適合用批處理接口來實現。如果你的程序沒有人守着就不能成批壓縮收藏的音樂樂曲或分析前一天的股票信息,那你的程序有什麼好的呢?
  好,現在言歸正傳,你怎麼能夠實現一個組合了用戶界面/控制檯的應用呢?現在幾乎所有的 Windows 程序員都知道,Windows 把 EXE(可執行程序)分成兩 大類:控制檯應用和 GUI應用。這種體系結構可以追溯到 Windows 的早期,當時它首先是從 MS_DOS 中發展而來的。如今,你只要給鏈接 器一個開關:/subsystem:Windows 或者 /subsystem:console,你就能生成你想要的那種應用程序。
  所以,如果你要建立一組合應用,首要問題是:它是一個控制檯應用還是一個GUI應用?最初,你可能認爲要建立一個控制檯應用,以後它還能夠作爲一個 GUI 程序運行。從來沒有誰說過一個控制檯應用就不能夠創建窗口或處理消息,控制檯之所以是控制檯,那是因爲當控制檯不存在時, Windows 會爲控制檯應用創建一個控制檯。但是這裏有一個問題,如果你在 Windows 下通過在其資源管理器(Explorer)中雙擊或快捷方式運行某個控制檯應用程序,Windows 將會創建一個控制檯,你可以通過調用 FreeConsole 來銷燬 這個控制檯,但是這個控制檯窗口會暫時一閃而過,告訴整個世界你其實並不知道你自己做了什麼。
  然後,要使它爲一個GUI應用。那麼你如何把它寫到控制檯呢?有許多文章解釋了怎樣重新路由 printf 或 cout 到控制檯,但是, 它們都涉及到創建新控制檯窗口的問題,不是使用一個當程序是從命令行被啓動時已經存在的窗口。即使有某個使用現有控制檯的途徑,那你又怎麼知道你的應用程序是通過 Windows Explorer 還是通過命令提示符調用的呢?
  有一個新的函數( Windows XP 使用的)正好可以利用:這個函數是 AttachConsole。 它允許你將程序“綁定”到其它進程的控制檯窗口,如果你用了專用的進程 ID:ATTACH_PARENT_CONSOLE,AttachConsole 將綁定到啓動你的程序的控制檯。太好了,但是有兩個問題,第一,AttachConsole 只能在 Windows XP 系統中使用,所以如果你想要你的程序運行在其它版本的 Windows 中,就沒那麼走運了;第二,AttachConsole 工作並不穩定,你可以寫內容到控制檯,但是你的程序退出後,命令提示符就亂七八糟了。
  簡而言之,基於 Windows 的應用程序要麼是控制檯應用,要麼是GUI應用,二者不可兼得。(除非你想寫你自己的啓動代碼,那已非我力所能及)。但是你知道它 是能夠做到的,因爲我已經告訴你 Visual Studio 能行,到底怎樣做呢?
  如果你看一下 Visual Studio 的安裝目錄,你會發現實際上有兩個程序:devenv.exe和 devenv.com。還記得.com 是什麼嗎? 它可不是 Web,而是可執行程序,在很久很久以前,當你還是小孩子的時候,基於 Windows 的程序有三種內存模式:大內存模式(large)、小內存 模式(small)和巨大內存模式(huge)。其它的模式都被叫做緊湊模式或微小模式,它們產生不同類型的可執行文件,這些可執行文件都以 .com 作爲擴展名。(.com文件是一種在加載時不需要固定地址的直接內存映 象,這樣使用起來非常的快,但它們必須很小。) 現在內存模式已經沒有這麼多了,大部分可執行文件都使用PE格式。但是命令解釋器仍然能識別 .com 可執行文件,並且你可以將任何.exe 程序重新 更名爲 .com 程序,如把 foo.exe 改成 foo.com,它仍然可以通過輸入名字執行。所以可以用這個技巧去創建兩個程序:foo.com 和 foo.exe。一個是 控制檯應用程序,另一個是基於 Windows 應用程序。

Figure 2 在對話框裏顯示進程列表
Figure 2 在對話框裏顯示進程列表

  爲了示範它的工作原理,我修改了我在2002年7月專欄文章裏的程序lp(列舉進程)(編者注:中文譯文參見在線雜誌第14期文章——“如何獲取某個進程的主窗口以及創建進程的程序名?”),它既可作爲 GUI 程序運行,也可作爲控制檯程序運行。如果你輸入 ListProc 而不用參數,它會在對話框中列出進程,如 Figure 2 所示。如果你鍵入 ListProc -c,它會以控制檯模式運行並列出進程,如 Figure 3 所示。ListProc 有兩個主程序文件:ListProc.cpp 是通常的 MFC 應用實現,ListProc-cons.cpp 是控制檯應用實現。這兩個程序都調用相同的模塊—— EnumProc,實際的進程列表正是由它產生的。ListProc-cons 處理命令行並顯示控制檯信息,沒有用命令行參數的程序通過調用 ShellExecute 啓動程序的 GUI 版本。
// 將 myself.com 改爲 myself.exe 並運行
TCHAR lpExeName[_MAX_FNAME];
GetModuleFileName(NULL, lpExeName, _MAX_FNAME);
LPTSTR ext = lpExeName + _tcslen(lpExeName) - 3;
_tcscpy(ext,_T("exe"));
ShellExecute(NULL, _T("open"), 
  lpExeName, NULL, NULL, SW_SHOWNORMAL);

Figure 3 在在控制檯應用中列出進程表
Figure 3 在控制檯的進程列表

Figure 4 是 ListProc-cons 的全部代碼,Visual Studio 的解決方案包含兩個工程:ListProc和 ListProc-cons。後者有一個定製編譯步驟,是重命名輸出文件 ListProc-cons.exe 爲ListProc.com (參見 Figure 5)。當你安裝程序時,要保證把 .com 和 .exe 都放在了相同的目錄下,並且確保你創建的任何快捷方式都指向 .exe 文件。那樣,從 Windows 調用會直接運行.exe 文件,而從控制檯調用則運行 .com 文件(如果 .com 和 .exe 都存在於用戶的路徑下, Windows 首選 .com 文件運行)。明白了嗎?

Figure 5 將 .exe 改爲 .com 文件
Figure 5 將 .exe 文件重命名爲 .com
 

 

 

c++控制檯應用程序
懸賞分:50 - 解決時間:2009-9-19 12:38
設計一個控制檯應用程序XXXPersion,其中包含一個描述人的抽象類PersionClass,利用繼承的方式派生學生類StudentClass,教師類TeacherClass和歌手類SingerClass等,在PersionClass類中要有必要的數據如:姓名、性別、年齡等,在派生類StudentClass中要有所在學校等與學生有關的數據的描述;在TeacherClass類中要有職稱等與教師有關的相關數據的描述,在SingerClass中要有住址、身高等與歌手有關的數據的描述。總的要求:要有必要的獲得數據的手段,如獲得學生、教師或歌手的姓名、性別、年齡,學生所在的學校、教師的職稱、歌手的住址等,儘量將題目設計完整,功能完善,同時設計測試類對所設計的類及包含的功能進行測試。
評分標準:
1. 正確合理設計PersionClass類             10分
2. 正確使用繼承設計StudentClass類                10分
3. 正確使用繼承設計TeacherClass類                10分
4. 正確使用繼承設計SingerClass類               10分
5. 能夠正確設計測試類並進行合理測試           10分
6. 程序整體效果及運行                         10分 
問題補充:
學校的一次模擬,大家幫幫忙,對了,後面的題目的分數!!
提問者: 村裏有點窮 - 二級
 
 
 
 
 
 
 
最佳答案
#include <stdio.h>
#include <iostream>

using namespace std;

class XXXPerson{
public:
 char name[20]; //姓名
 char sex[2]; //性別
 int age; //年齡
public:
 XXXPerson(){
  memset(name, 0, 20);
  memset(sex, 0,2);
  age = 0;
 }
 XXXPerson(char n[], char s[], int i){  
  strcpy(name, n);  
  strcpy(sex, s);
  age = i;
 }
 virtual void displayInfo(){
  cout << "Person--> name: "<<name << "/t sex: " << sex << "/t age: " << age <<"." << endl;
 }
};


class StudentClass:public XXXPerson{
public:
 char school[50]; //所在學校
 char otherinfo[200]; //其它信息
public: 
 StudentClass(char n[], char s[], int age, char sch[], char oi[]){
  strcpy(name, n);  
  strcpy(sex, s);
  this->age = age;
  strcpy(school, sch);
  strcpy(otherinfo, oi);
 }
 virtual void displayInfo(){
  cout << "學生 "<<name << "  的信息:" << endl;
  cout<< "/t性別:/t/t" << sex << endl;
  cout << "/t年齡:/t/t" << age << endl;
  cout << "/t所在學校:/t" << school << endl;
  cout << "/t附加信息:/t" << otherinfo << endl;
 }
};


class TeacherClass:public XXXPerson{
public:
 char tlevel[50]; //職稱
 char otherinfo[200]; //其它信息
public: 
 TeacherClass(char n[], char s[], int age, char sch[], char oi[]){
  strcpy(name, n);  
  strcpy(sex, s);
  this->age = age;
  strcpy(tlevel, sch);
  strcpy(otherinfo, oi);
 } 
 virtual void displayInfo(){
  cout << "老師 "<<name << "  的信息:" << endl;
  cout<< "/t性別:/t/t" << sex << endl;
  cout << "/t年齡:/t/t" << age << endl;
  cout << "/t職稱:/t/t" << tlevel << endl;
  cout << "/t附加信息:/t" << otherinfo << endl;
 }
};

class SingerClass:public XXXPerson{
public:
 int stature; //身高
 char address[200]; //住址
 char otherinfo[200]; //其它信息
public: 
 SingerClass(char n[], char s[], int age,int t, char sch[], char oi[]){
  stature = t;
  strcpy(name, n);  
  strcpy(sex, s);
  this->age = age;
  strcpy(address, sch);
  strcpy(otherinfo, oi);
 } 
 virtual void displayInfo(){
  cout << "歌手 "<<name << "  的信息:" << endl;
  cout<< "/t性別:/t/t" << sex << endl;
  cout << "/t年齡:/t/t" << age << endl;
  cout << "/t身高:/t/t" << stature << endl;
  cout << "/t住址:/t/t" << address << endl;
  cout << "/t附加信息:/t" << otherinfo << endl;
 }
};

int main(void){
 StudentClass p1("小明", "男", 19, "XX大學", "學生測試。");
 SingerClass p2("劉德華", "男", 40, 180,"保密不公開。", "歌手測試。");
 TeacherClass p3("李老師", "女", 39, "高級教師", "老師測試");
 
 XXXPerson *p[3] = {&p1, &p2, &p3};
 for(int i=0; i<3; i++)
  p[i]->displayInfo();
 
} 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章