我用VC的SDK编程 .
其类似用记事本功能,但不知为何,在读取*.txt 文件的内容到EDIT 上时,
读出的内容与*.TXT 的内容不符.
程序很小,请各位看以下源码并指点:#include <windows.h>
#include "resource.h"
#include <COMMDLG.h>
#define ID_EDITCHILD 12 #ifndef IDM_EXIT
#define IDM_EXIT     13
#endif
bool initapplication(HINSTANCE)  ;
bool initinstance(HINSTANCE,int) ;
void opentextfile(HWND,HWND) ;
LRESULT APIENTRY winproc(HWND,UINT,WPARAM,LPARAM) ;HINSTANCE hinst ;
int APIENTRY WinMain(HINSTANCE hinstance,
 HINSTANCE hprevinstance,
 LPSTR     lpcmdline,
 int       nshowcmd)
{
MSG  msg ;
if (!initapplication(hinstance))
return false ;
if (!initinstance(hinstance,nshowcmd))
return false ;
hinst = hinstance ;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg) ;
DispatchMessage(&msg) ;
};
return msg.wParam ;
};
bool initapplication(HINSTANCE hinstance) 
{
WNDCLASS wndclass ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH) ;
wndclass.hCursor = LoadCursor(hinstance,IDC_ARROW) ;
wndclass.hIcon = LoadIcon(hinstance,IDI_APPLICATION) ;
wndclass.hInstance = hinstance ;
wndclass.lpfnWndProc = (WNDPROC)winproc ;
wndclass.lpszClassName = "FILEDLGCLASS" ;
wndclass.lpszMenuName = NULL ;
wndclass.style = 0 ;
return (RegisterClass(&wndclass)) ;
};bool initinstance(HINSTANCE hinstance,int nshowcmd) 
{
HWND  hwnd ;
hwnd = CreateWindow("FILEDLGCLASS",
"这是文本程式示例",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
LoadMenu(hinstance,MAKEINTRESOURCE(MENUD)),
hinstance,
NULL) ;
if (!hwnd)
return false ;
ShowWindow(hwnd,nshowcmd) ;
return true ;
};LRESULT APIENTRY winproc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam) 
{
static HWND hwndedit ;
switch(message)
{
case WM_CREATE :
//WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL|ES_LEFT|ES_MULTILINE
//|ES_AUTOVSCROLL|ES_AUTOHSCROLL,
hwndedit = CreateWindow("EDIT",
NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_HSCROLL|ES_LEFT|ES_MULTILINE
|ES_AUTOVSCROLL|ES_AUTOHSCROLL,
0,0,0,0,
hwnd,
(HMENU)ID_EDITCHILD,
hinst,
NULL) ;
ShowWindow(hwndedit,1) ;
SetFocus(hwndedit) ;
if (!hwndedit)
MessageBox(hwnd,"FAILE","ERROR",MB_OK) ;
break ;
case WM_SIZE :
MoveWindow(hwndedit,0,0,LOWORD(lparam),HIWORD(lparam),true) ;
break ;
case WM_COMMAND :
switch(LOWORD(wparam))
{
case IDM_OPEN :
opentextfile(hwnd, hwndedit) ;
break ;
case IDM_EXIT :
SendMessage(hwnd,WM_DESTROY,0,0L) ;
break ;
};
break ;
case WM_DESTROY :
PostQuitMessage(0) ;
break;
default :
return (DefWindowProc(hwnd,message,wparam,lparam));
break;
};
return false ;
};void opentextfile(HWND hwnd,HWND hwndedit) 
{
OPENFILENAME  openfilename ;
char szdirname[MAX_PATH] = "" ;
char szfile[MAX_PATH] = "\0"  ;
char szfiletitle[MAX_PATH] = "\0" ;
////openfilename  结构说明
char  szfilter[]= "文本文件(*.txt)\0*.txt\0C源码文件\0*.c\0所有文件\0*.*\0" ;
openfilename.lStructSize = sizeof(OPENFILENAME) ;
openfilename.hwndOwner = hwnd ;
openfilename.hInstance = hinst ;
openfilename.lpstrFilter = szfilter ;  ///
openfilename.lpstrCustomFilter = (LPTSTR)NULL ;
openfilename.nMaxCustFilter = 0L ; ///
openfilename.nFilterIndex = 1L ; ///
openfilename.lpstrFile =szfile ; //----
openfilename.nMaxFile = sizeof(szfilter) ;
openfilename.lpstrFileTitle = szfiletitle ;
openfilename.nMaxFileTitle = sizeof(szfiletitle) ;
openfilename.lpstrInitialDir = NULL ;
openfilename.lpstrTitle = "请迁择一个文本文件" ;
openfilename.nFileOffset = 0 ;
openfilename.nFileExtension = 0 ;
openfilename.lpstrDefExt = "*.txt" ;
openfilename.lCustData = 0 ;
openfilename.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY ;

if (GetOpenFileName(&openfilename) )
{
HANDLE hfile ;
DWORD  dwfilesize,dwbyteread ;
char  *lpbufptr ;
///打开指定的文件
hfile = CreateFile(szfile,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL) ;
if(hfile)
{
dwfilesize = GetFileSize(hfile,NULL) ;
if (dwfilesize!=0xFFFFFFFF) //返回表成功
{
lpbufptr = (char*)malloc(dwfilesize) ;
if (lpbufptr!= NULL)
{
///把文件内容读到缓存区
ReadFile(hfile,(LPVOID)lpbufptr,dwfilesize,&dwbyteread,NULL) ;
//MessageBox(hwnd,"GC","RUN",MB_OK);
if (dwbyteread!=0) 
{
//写到EDIT;
SendMessage(hwndedit,WM_SETTEXT,0,(LPARAM)lpbufptr);
SetWindowText(hwnd,openfilename.lpstrFile) ;
//MessageBox(hwnd,(LPCTSTR)lpbufptr,"提示",MB_OK) ;
SetWindowText(hwndedit,(LPCTSTR)lpbufptr) ;
}
else
MessageBox(hwnd,"读入字节是零","error",MB_OK);
}
else
MessageBox(hwnd,"缓存分配失败!","error",MB_OK);
}
else
MessageBox(hwnd,"读取文件长度失败!","error",MB_OK);
}
else
MessageBox(hwnd,"打开文件失败!","error",MB_OK);
}
else
MessageBox(hwnd,"无效的文件名与路径!","error",MB_OK);
};

解决方案 »

  1.   

    ReadFile(hfile,(LPVOID)lpbufptr,dwfilesize,&dwbyteread,NULL)是以二进制读取的没有处理CRLF,你改用c++的ifstream用文本模式吧
      

  2.   

    回複樓上:不知是不是我的文本文件有問題,我如果用
    c語言的fopen ,fputc 建一個文本文件, 再用
    ReadFile 可讀出,,,
      

  3.   

    1、判断CreateFile是否成功应为 if(INVALID_HANDLE_VALUE!=hFile){...} //INVALID_HANDLE_VALUE为(-1).
    2、lpbufptr = (char*)malloc(dwfilesize) ; 后再加上memset(lpbufptr, 0, dwfilesize);
       或直接用lpbufptr=(char *)LocalAlloc(LPTR, dwfilesize);
    3、在ReadFile之前,加上dwbyteread=0;