dポイントプレゼントキャンペーン実施中!

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;
}

A 回答 (1件)

文字列について、もう少し勉強した方がいいと思いますが……。



case WM_CHAR:
でいぢっているbuffer[]には、文字列の終端をあらわす'\0'についての処理は入っていますか?
'\0'が入っていないのであれば、
>WriteFile(hFile,buffer,(DWORD)lstrlen(buffer),
>&dwAccBytes,NULL);
>SetWindowText(hWnd,szFileTitle);
の2つはバッファオーバーランする可能性が限りなく高いですが、それは意図した動作ですか?
# ついでにhWndは何者ですか?
    • good
    • 0
この回答へのお礼

遅くなり申し訳ございません。
仰っていただいたとおり文字列に関してはもう一度勉強しなおします。
大変参考になりました。
WriteFile(hFile,buffer,(DWORD)lstrlen(buffer)を下記の通りにすると、
解消されました。
WriteFile(hFile,buffer,lstrlen(buffer)*sizeof(TCHAR);

お礼日時:2010/06/08 20:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A