在視窗程式中使用string的iostream
程式設計就像設計法律一樣要恢恢而不漏,程式有漏洞依情況,會損失大量的人力、金錢甚至生命,法律有漏洞不公正就會產生很多做私刑的人。
這次介紹的方法可用在C++ builder 2009,MFC 2008,C++.net字元都是用wchar_t,因為現在是個國際化的社會,如果你只有用ANSI的話,變成亂碼的機率太高了,相信沒人想玩亂碼猜猜看的遊戲。
會研究這個功能主要是針對 工業類科技藝競賽 中使用C++的弱勢族群研究的。
而利用這個功能就可以在視窗程式中輕鬆的輸出入文字,函數位址,等等在CMD下面能做的輸出入,其實我只不過是把字串變成字串串流罷了,相信很多高手大大早就會了,不過呢?我只是懷著助人為快樂之本的心對大家野人現曝罷了,因為這個簡單的功能msdn上沒寫= =
也沒有半本書有寫,網路上也很難找= =(關鍵字要打什麼呢?),有一天,在novus大大的blog看到了一個解四則運算說是C++的程式,但是一臉C樣,於是我回了,沒有C++的味道,在novus大大的熱心助人之下多了一個有C++味的版本,呀!香噴噴的?
然後我就拿來改一改,加了簡單的指數跟sin,cos,tan... etc.今年七月的某一天,耶!在練習歷屆工科的題目,想到那些弱勢族群,唉~
突然看到iss.str();頓時晃然大悟!視窗程式應該可以用stringstream來輸出入喔!所以就開始研究把字串轉成stringstream的方法了,然後我在MFC摸了兩小時,C++ builder摸了一小時,C++.net摸了一小時,終於自己摸出來了,拜託是自摸耶!想當然很是感動XD怕網路上新手跟我一樣要摸很久才摸的到,這是運氣問題,嗯嗯(~_~)所以剛好心情好就提供給大家啦!雖然大家可能也用不太到?因此假如你很會玩stringstream 的話,到任何的C++環境都很吃香的,字串處理超神的,非常的方便一點也不輸VB呀!(笑)!
其實在MFC,C++ builder,C++.net中都差不多,一模不一樣(謝麗娟老師名言!)而已。
︵︵
\/~~(註:另外還有通通當掉好了、好喜歡數學、數學好簡單、不可以欺負老師、小老師記~~~~也是她說的)
以上都是心得,笑笑就好,重點在下面= =”
在MFC中的設定通常是選 MFC應用程式->應用程式設定->以對話方話為主,然後用編輯資源檔的方式來編輯要用的元件。
以下以解決93年工科技藝競賽第1題為例,簡單的問題比較好做示範XD
問題是:
(用adobe的ORC技術從圖片掃出來的,Adobe好神,掃15秒只錯三個字)
試題一(12%) :自由落體
說明:已知固定支架與地面的高度為H'固定支架上可放置一個直徑大小D的球。當球落下時會以自
由落體(Free Falling)至地面,且自然上下彈跳減速至停止。假設每次球落至地面而向上彈回高度
H'為
H' =前一次落地高度/ 2 - 球直徑D/5 >= 0
且此彈回高度H'以球下緣至地面估算之,並取整數單位。試選擇固定支架與地面的高度H與放置於固
定支架上的球直徑大小D'啟動自由落體能依序計算每次球落至地面而向上彈回高度及總共彈跳次數。
輸入格式:每列兩個數值,每個數值以一個空白間格,依序分別固定支架與地面的高度H 與放置於固定支架上的球直徑D
輸出格式:依序顯示每次球落至地面而向上彈回高度及總共彈跳次數,每個數值以一個空白間格。
輸入範例1 :
120 20
輸出範例1 :
120 56 24 8 0 3
輸入範例2:
200 10
輸出範例2:
200 98 47 21 8 2 0 5
MFC中的程式碼
我在MFC中的設定是選 MFC應用程式->應用程式設定->以對話方話為主 ,然後用編輯資源檔的方式來編輯要用的元件。
以Edit Control資源示範
#include <sstream>
void CMy931MFCDlg::OnBnClickedOk()
{
// TODO: 在此加入控制項告知處理常式程式碼
std::wistringstream iss;
std::wostringstream oss;
CString csTmp;
InputBox.GetWindowText(csTmp);
iss.str(csTmp.GetString());
int H = 0,D = 0;
int i = -1;
iss >> H >> D;
for (;H > 0;)
{
++i;
oss << H << " ";
H = H/2 - D/5;
}
oss << "0 " << i;
csTmp.SetString(oss.str().c_str());
OutputBox.SetWindowText(csTmp);
}
//以93年工科題為例
在MFC中要換行的話可以用oss << "\r\n"; 來處理,std::endl是沒用的。
但記得Edit Control的Vertical Scroll要等於True不然沒辨法往下拉。
C++ builder中的程式碼
以TEdit元件示範
#include <sstream>
void __fastcall TForm3::Button1Click(TObject *Sender)
{
std::wistringstream iss;
std::wostringstream oss;
iss.str(InputBox->Text.w_str());
int H = 0,D = 0;
int i = -1;
iss >> H >> D;
for (;H > 0;)
{
++i;
oss << H << " ";
H = H/2 - D/5;
}
oss << "0 " << i;
OutputBox->Text = oss.str().c_str();
}
C++
builder中要多行的話必需使用TMemo物件,要往下拉的話ScrollBars要等於ssVertical。
也是用oss << "\r\n";
又花了一小時找到C++.NET的用法了= =,但在程式中使用此技巧會使執行檔快速變大約1MB,因此有點麻煩,經測試可在.NET Framework 2.0/3.0/3.5 中使用。
以system::Windows::Forms::TextBox^示範
#include <vcclr.h> //使用PtrToStringChars需要
#include <sstream>
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
std::wistringstream iss;
std::wostringstream oss;
//下面這句可以把"System::String^" cast to "wchar_t*"
pin_ptr<const wchar_t> wch = PtrToStringChars(InputBox->Text);
iss.str(wch);
int H = 0,D = 0;
int i = -1;
iss >> H >> D;
for (;H > 0;)
{
++i;
oss << H << " ";
H = H/2 - D/5;
}
oss << "0 " << i;
OutputBox->Text = gcnew String(oss.str().c_str()) ;
}
要往下拉的話ScrollBars等於Vertical。
以上測試環境為32位元Vista中。
以上只是牛刀小試,要很神的話,請參考The C++ Standard Library這本書(中譯:C++標準程式庫)還有C++ Primer Plus 5/e這本也不錯,裡面有詳細使用範例的啦!去原作者的網站也載的到。