открываю текстовый файл, надо его отобразить в CEdit.
Но файл либо в 866 либо в 1251. С автоопределением возиться не стал, хай пользователь определяет вручную. И если 1251 вроде разобрался как, то при 866 использую OemToChar и... фигня какая-то(
Код строился MFC Dialog. CEdit мультистроковый. код ниже, не смеяццо)
Код: Выделить всё
//получаем имя обрабатываемого файла и выводим кусок
void CTableConvert_3Dlg::OnBnClickedButton1(){
// TODO: добавьте свой код обработчика уведомлений
CString s1,s2;
TCHAR szPath[MAX_PATH];
char s3[127];
::GetCurrentDirectory(MAX_PATH, szPath);
CFileDialog ifd(TRUE);
ifd.m_ofn.lpstrInitialDir = szPath;
ifd.m_ofn.lpstrFilter =
_T("Текстовые файлы (*.txt)\0*.txt*\0")
_T("Все файлы (*.*)\0*.*\0");
ifd.DoModal();
ifile=ifd.GetPathName();
/////////////////////////////////////////////////////
// этот кусок выводит часть файла в кодировке 1251 //
/////////////////////////////////////////////////////
/* ifs.open(ifile,ios::in|ios::binary);
for(int i=0;i<30;i++){
ifs.getline(s3,127);
s1=s3;
s1=s1+"\r\n";
s2=s2+s1;
}
m_Edit.SetWindowText(s2);*/
m_editFilename.SetWindowText(ifile);
/////////////////////////////////////////////////////
// а вот тут через проецирование файла в память //
// выводим в кодировке 866 //
/////////////////////////////////////////////////////
// ifile.m_Table=cp1251;
// а теперь отображение содержимого файла тут оно не надо
//проецируем файл в память
HANDLE hFile=CreateFile(ifile, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hFilemap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
DWORD dwFileSizeHigh;
int qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
CloseHandle(hFile);
pbFile = (PBYTE) MapViewOfFile(hFilemap, FILE_MAP_COPY, 0, 0, 0);
CloseHandle(hFilemap);
PBYTE tmp=pbFile;
char str[130], str1[250];
char* str3=(char*)malloc(qwFileSize*2+3000);
// тут выделяем строки шоб скормить OemToChar
for(int k=0,i=0,j=0;i<qwFileSize;i++,k++){
str[k]=pbFile[i];
if(pbFile[i]=='\n'){
str[k]=0;
OemToChar(LPCSTR(str), (LPWSTR)str1);
m_View += str1;
m_View += "\r\n";
/* for(k=0;str1[k];str3[j++]=str1[k++]);
str3[j++]=0;*/
k=-1;
}//if
}//for
// m_Edit.SetWindowText((LPWSTR)str3);
UpdateData(false);
}
выводил строки после OemToChar(LPCSTR(s3), (LPWSTR)str1);
AfxMessageBox((LPCTSTR)str1, MB_OK);
m_View += str1;
m_View += "\r\n";
AfxMessageBox(m_View, MB_OK);
str1 - вроде бы нормально конвертнуло, в вот уже после прибавления к m_View какая-то лажа выходит(( первый раз строка присваивается, а вот потом кракозябры, а не содержимое str1 прибавляются.