2016-07-15 6 views
0

学校の割り当てには、ゲームを終了する必要があります。私はほぼ完成しましたが、最後の課題は私に苦労しています。C++、txtファイルからテキストを読み取り、テキストボックスに追加するか、またはテキストボックスにテキストを追加する

現在、ユーザーがスコアが高い場合に、編集ボックスからテキスト(名前)を取得する方法を考え出しました。

これはで行われます。

GetDlgItemText(hDlg, IDC_EDIT1, &Tsaved, 20);//Get text from edit box 

私もこのメッセージボックスにそれを追加することができています:

MessageBox(hDlg, &Tsaved, buff, IDOK == nId);//write text from edit box to message box 

私の思考プロセスとコードのプロセスはこれです:

取得したテキストをテキストボックスに直接追加することができなかったため、取得したテキストをテキストファイルに書き込んでいます。これで私はファイルに何かを書くことができます。

私はTsavedTCHARで2バイトしかないことを知っていますが、文字列を使用するファイルに書き込むには、文字列にキャスト/変換する必要があります。これで、取得するテキストの最初の文字をファイルに書き込むだけです。

例: エディットボックスの入力: "ドン"
メッセージボックス出力: "ドン"
テキストファイル出力: "D"

は、これは私が鋳造/ A変換を行っている方法です。

TCHAR Ts = Tsaved; 
stringstream ss; 
string s; 
char c = Ts; 
ss << c; 
ss >> s; 

そして、これは私がファイルに書き込む方法です:

std::ofstream inputfile("filename.txt"); 
if (!inputfile) 
{ 
    std::cerr << "Error writing to ..." << std::endl; 
} 
else 
{ 
    for (int x = 0; x < sizeof(Tsaved)-1; x++) 
    { 
     int a = sizeof(Ts); 
     //inputfile << sizeof(Tsaved)/sizeof(TCHAR) << endl; 
     inputfile << s << endl; 
     //inputfile << a << endl; 
    } 
} 

どのように私は取得した編集ボックスの全内容をテキストファイルに書き込むことができますか?

答えて

0

最初の問題は、Tsavedには1文字を入れるだけの十分なスペースがあることです。テキストボックスのコンテキスト全体を保持するのに十分なメモリを割り当てる必要があります。

HWND hEditBox = GetDlgItem(IDC_EDIT1); 
int len = GetWindowTextLength(hEditBox); 

TCHAR* text = new TCHAR[len+1]; // need +1 to account for trailing nullptr 
GetWindowText(hEditBox, text, len); 

text今エディットボックスのフルテキストが含まれている必要があります:あなたはGetWindowTextLength()GetWindowText()を呼び出すことによってこれを行うことができます。 textnew[]を使用して割り当てられていたので、あなたにも、それを削除する必要があります

std::ofstream inputfile("filename.txt"); 
inputFile << text; 

:あなたは今のファイルにそれを書くことができます

delete[] text; 

第二に、あなたのプログラムがある場合、私は知りませんUnicodeとしてコンパイルされているかどうかはわかりませんが、TCHARの場合はcharの代わりにwchar_tと定義されます。非ASCII文字を含むことができるので、std::ofstreamの代わりにstd::wofstreamを使用する必要があります。 2つのクラスは同じAPIを持ちますが、後者はすべてのUnicode文字を処理できます。

最後に、あなたはしないように自動的に割り当てられたメモリを削除しますた(私はあなたが使用しているのVisual Studioのバージョンを知りませんが、それは最近のものであれば、あなたはunique_ptrnew[]delete[]を置き換えることができますそうすることを覚えておく必要があります):

std::unique_ptr<TCHAR[]> text = std::make_unique<TCHAR[]>(len + 1); 
GetWindowText(hEditBox, text.get(), len); 

inputFile << text.get(); 
+0

ありがとう、私は2番目にそれを試してみます。私はビジュアルスタジオ2015を使用しています...もう1つの質問は、あなたはそれが1つの文字チャットのためのスペースしか持っていないと言いました。メッセージボックスが完全に取得されたテキストを取得することはどうしたら可能ですか? –

+0

@ D-Antonio 'GetDlgItemText()'を呼び出すときに20文字分の空きがあると言ったので、20文字全てをコピーしました。余分な19文字は、あなたがスペースを持っていた1文字の後にメモリにあったものに書き込まれていたので、メモリは壊れていました。基本的に重要なことは何も上書きされていないことが幸運にも得られました。 – Andy

関連する問題