WriteFile関数
C言語でWindowsプログラミングを学習中です。
2点ご質問です。
LPTSTR型のbufferには(1)のように文字列を格納して、
画面に表示しています。
ファイルに保存するために改行は「\r\n」に置き換えているので、
画面上ではもちろん改行されません。
Editコントロールを使用すれば簡単にいくと思いますが、
このような方法で画面上にも改行・ファイルにも改行という方法はありますか?
さらに(2)で保存したファイルを開くと文字と文字の間に半角のスペースが
入ってしまいます。
ごくたまに入らない時もありますが、文字列の一部しか表示されません。
これはUNICODEとマルチバイトの関係なのでしょうか?
UNICODEを定義しています。
マルチバイトを定義してしまうとGetSaveFileName関数が
エラーになってしまうので・・・
ご教授お願いします。
(1)
case WM_CHAR:
if(wp==VK_BACK){
if(!iCount)
return 0;
iCount--;
InvalidateRect(hWnd,NULL,TRUE);
}else if(wp==VK_RETURN){
buffer[iCount++]='\r\n';
InvalidateRect(hWnd,NULL,TRUE);
return 0;
}else{
buffer[iCount++]=(TCHAR)wp;
InvalidateRect(hWnd,NULL,TRUE);
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
GetClientRect(hWnd,&rc);
DrawText(hdc,buffer,iCount,&rc,DT_WORDBREAK);
EndPaint(hWnd,&ps);
return 0;
・
・
・
・
(2)
int MySave(LPTSTR buffer,HWND hWnd)
{
OPENFILENAME ofn;
HANDLE hFile;
TCHAR szFile[MAX_PATH];
TCHAR szFileTitle[MAX_PATH];
DWORD dwAccBytes;
memset(&ofn,0,sizeof(OPENFILENAME));
ofn.lStructSize=sizeof(OPENFILENAME);
ofn.hwndOwner=hWnd;
ofn.lpstrFilter=TEXT("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0");
ofn.lpstrFile=szFile;
ofn.lpstrFileTitle=szFileTitle;
ofn.nFilterIndex=1;
ofn.nMaxFile=MAX_PATH;
ofn.nMaxFileTitle=MAX_PATH;
ofn.Flags=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY;
ofn.lpstrDefExt=TEXT("txt");
ofn.lpstrTitle=TEXT("名前を付けて保存");
if(!GetSaveFileName(&ofn))
return -1;
hFile=CreateFile(szFile,GENERIC_WRITE,0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hFile,buffer,(DWORD)lstrlen(buffer),
&dwAccBytes,NULL);
SetWindowText(hWnd,szFileTitle);
CloseHandle(hFile);
return 0;
}
No.1ベストアンサー
- 回答日時:
文字列について、もう少し勉強した方がいいと思いますが……。
case WM_CHAR:
でいぢっているbuffer[]には、文字列の終端をあらわす'\0'についての処理は入っていますか?
'\0'が入っていないのであれば、
>WriteFile(hFile,buffer,(DWORD)lstrlen(buffer),
>&dwAccBytes,NULL);
>SetWindowText(hWnd,szFileTitle);
の2つはバッファオーバーランする可能性が限りなく高いですが、それは意図した動作ですか?
# ついでにhWndは何者ですか?
遅くなり申し訳ございません。
仰っていただいたとおり文字列に関してはもう一度勉強しなおします。
大変参考になりました。
WriteFile(hFile,buffer,(DWORD)lstrlen(buffer)を下記の通りにすると、
解消されました。
WriteFile(hFile,buffer,lstrlen(buffer)*sizeof(TCHAR);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
文の改行
-
エスケープ文字の復帰(¥r)と...
-
COBOLの改行
-
JavaMail,本文中の改行について
-
改行について
-
C++でのCRLFについて
-
jsp 改行コードで改行させて表...
-
エクセルVBA 文字列領域が不足...
-
ファイルから読み取った改行文...
-
ダイアログにおける改行
-
VBAでCSVをExcelに取り込む時に...
-
fscanf関数について
-
最終行の改行について
-
改行を読み飛ばす
-
PDFlibでのPDF生成について
-
C# DataGridViewのセルを改行禁...
-
プログラムコードを入力する場...
-
メールフォーム(Smarty)の改行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
COBOLの改行
-
C++で空Enterの入力を判...
-
改行について
-
ファイルから読み取った改行文...
-
jsp 改行コードで改行させて表...
-
JAVA System.out.println の ...
-
テキストファイルから改行コー...
-
Excel VBAからBeckyを起動して...
-
【VBA】エクセルで最後の不要な...
-
C++でのCRLFについて
-
VBAでCSVをExcelに取り込む時に...
-
改行を読み飛ばす
-
エクセルVBA 文字列領域が不足...
-
JavaMail,本文中の改行について
-
グレープシティのSPREAD...
-
最終行の改行について
-
変数の中の改行コードをBRタグ...
おすすめ情報