How To Read a Big Txt File into CEdit and write it as save!.
This problem is important when we want create a NOTEBOOK like Microsoft,some times we must use this teck to use
as logs , and also some other,now it is a usefull solution that have spent much time to get it!
ONE:ReadFile:
void CShowPicDlg::showTXTFile2(CString fileName){
CWnd *hwnd;
hwnd=GetDlgItem(IDC_PIC);
hwnd->ShowWindow(FALSE);
hwnd=GetDlgItem(IDC_EDIT);
hwnd->ShowWindow(TRUE);
char *pstrFileName=fileName.GetBuffer(fileName.GetLength());
BYTE bySwap ;
DWORD dwBytesRead ;
HANDLE hFile ;
int i, iFileLength, iUniTest ;
PBYTE pBuffer, pText, pConv ;
// Open the file.
if (INVALID_HANDLE_VALUE ==
(hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL)))
return ;
// Get file size in bytes and allocate memory for read.
// Add an extra two bytes for zero termination.
iFileLength = GetFileSize (hFile, NULL) ;
pBuffer = (unsigned char*)malloc (iFileLength + 2) ;
// Read file and put terminating zeros at end.
ReadFile (hFile, pBuffer, iFileLength, &dwBytesRead, NULL) ;
CloseHandle (hFile) ;
pBuffer[iFileLength] = '\0' ;
pBuffer[iFileLength + 1] = '\0' ;
// Test to see if the text is unicode
iUniTest = IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_REVERSE_SIGNATURE ;
if (IsTextUnicode (pBuffer, iFileLength, &iUniTest))
{
pText = pBuffer + 2 ;
iFileLength -= 2 ;
if (iUniTest & IS_TEXT_UNICODE_REVERSE_SIGNATURE)
{
for (i = 0 ; i < iFileLength / 2 ; i++)
{
bySwap = ((BYTE *) pText) [2 * i] ;
((BYTE *) pText) [2 * i] = ((BYTE *) pText) [2 * i + 1] ;
((BYTE *) pText) [2 * i + 1] = bySwap ;
}
}
// Allocate memory for possibly converted string
pConv = (unsigned char*)malloc (iFileLength + 2) ;
// If the edit control is not Unicode, convert Unicode text to
// non-Unicode (ie, in general, wide character).
#ifndef UNICODE
WideCharToMultiByte (CP_ACP, 0, (PWSTR) pText, -1, (char*)pConv,
iFileLength + 2, NULL, NULL) ;
// If the edit control is Unicode, just copy the string
#else
lstrcpy ((PTSTR) pConv, (PTSTR) pText) ;
#endif
}
else // the file is not Unicode
{
pText = pBuffer ;
// Allocate memory for possibly converted string.
pConv = (unsigned char*)malloc (2 * iFileLength + 2) ;
// If the edit control is Unicode, convert ASCII text.
#ifdef UNICODE
MultiByteToWideChar (CP_ACP, 0, pText, -1, (PTSTR) pConv,
iFileLength + 1) ;
// If not, just copy buffer
#else
lstrcpy ((PTSTR) pConv, (PTSTR) pText) ;
#endif
}
//hwndEdit=m_edit.m_hWnd;
//SetWindowText (hwndEdit, (PTSTR) pConv) ;
::SetWindowText (m_edit.m_hWnd, (PTSTR) pConv) ;
free (pBuffer) ;
free (pConv) ;
}
void CShowPicDlg::writeTXTFile(CString fileName)
{
char *pstrFileName=fileName.GetBuffer(fileName.GetLength());
DWORD dwBytesWritten ;
HANDLE hFile ;
int iLength ;
PTSTR pstrBuffer ;
WORD wByteOrderMark = 0xFEFF ;
// Open the file, creating it if necessary
if (INVALID_HANDLE_VALUE ==
(hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, 0, NULL)))
return ;
// Get the number of characters in the edit control and allocate
// memory for them.
//iLength = GetWindowTextLength (hwndEdit) ;
iLength = ::GetWindowTextLength (m_edit.m_hWnd) ;
pstrBuffer = (PTSTR) malloc ((iLength + 1) * sizeof (TCHAR)) ;
if (!pstrBuffer)
{
CloseHandle (hFile) ;
return ;
}
// If the edit control will return Unicode text, write the
// byte order mark to the file.
#ifdef UNICODE
WriteFile (hFile, &wByteOrderMark, 2, &dwBytesWritten, NULL) ;
#endif
// Get the edit buffer and write that out to the file.
//GetWindowText (hwndEdit, pstrBuffer, iLength + 1) ;
::GetWindowText (m_edit.m_hWnd, pstrBuffer, iLength + 1) ;
WriteFile (hFile, pstrBuffer, iLength * sizeof (TCHAR),
&dwBytesWritten, NULL) ;
if ((iLength * sizeof (TCHAR)) != (int) dwBytesWritten)
{
CloseHandle (hFile) ;
free (pstrBuffer) ;
return ;
}
CloseHandle (hFile) ;
free (pstrBuffer) ;
}