И снова о добавлении текста в CEdit

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
_SG
Сообщения: 53
Зарегистрирован: 28 фев 2009, 10:43
Откуда: Севастополь

Уфф... Помогите с задачкой.
открываю текстовый файл, надо его отобразить в 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 прибавляются.
_SG
Сообщения: 53
Зарегистрирован: 28 фев 2009, 10:43
Откуда: Севастополь

ну раз никто не заинтересовался, админы - удалите тему

ЗЫ. разобрался я в тот же вечер в своей беде... но плюнюл на OemToChar, Wide... и иже с ними и сделал по старинке - перекодировал посимвольно таблицы
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Если никто не ответил, это не значит, что никому не интересно. Наоборот, чаще всего это значит, что никто не знает правильного ответа либо ленится вникать в суть дела. Если уже сам нашёл решение, то поделись им - потомки тебя не забудут.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
_SG
Сообщения: 53
Зарегистрирован: 28 фев 2009, 10:43
Откуда: Севастополь

Ну дали инет стабильно и лень победил. Проблема у меня была в том что не умею работать с двубайтовыми строками. OemToChar(LPCSTR(s3), (LPWSTR)str1) переводит str в WSTR. А наоборот в CSTR. Тут для меня всё понятно)
Я часа три промаялся, плюнул взял кодовые таблицы и сделал сам всё вручную:

Код: Выделить всё

void CTableConvert_3Dlg::OnBnClickedRadioWin(){	
	char str[127];
	m_View=L''; 	UpdateData(false);
	for(int k=0,i=0;i<qwFileSize;i++,k++){
 		if(pbFile[i]>=128 && pbFile[i]<=175) pbFile[i]+=64;
 		else if(pbFile[i]>=224 && pbFile[i]<=239) pbFile[i]+=16;
		str[k]=pbFile[i];
		if(pbFile[i]=='\n'){
			str[k]=0;
			m_View+=str;
			m_View+="\r\n";
			k=-1;
		}//if
	}//for
	UpdateData(false);
}

void CTableConvert_3Dlg::OnBnClickedRadioDOS(){	
	char str[127];
	m_View=L''; 	UpdateData(false);
	for(int k=0,i=0;i<qwFileSize;i++,k++){
       if(pbFile[i]>=240) pbFile[i]-=16;
       else if(pbFile[i]>=192) pbFile[i]-=64;
		str[k]=pbFile[i];
		if(pbFile[i]=='\n'){
			str[k]=0;
			m_View+=str;
			m_View+="\r\n";
			k=-1;
		}//if
	}//for
	UpdateData(false);
}
Ну и нормально всё в CEDIT вставил:

Код: Выделить всё

  //проецируем файл в память
	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;
	qwFileSize=GetFileSize(hFile, &dwFileSizeHigh);
	CloseHandle(hFile);
	pbFile = (PBYTE) MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0);
	CloseHandle(hFilemap);
//тут выводим в как будто файл в ср1251
// заодно и конвертнём символы в русские. Хотя это надо будет наверно перенести в другое место
// да и " на вордовские кавычки поменяем (20 номер в талблице) и N на № (19-й)
	char str[127];
	const unsigned char SVM[20]={0x63,0x65,0x61,0x6F,0x70,0x78,0x79,0x43,0x4B,0x45,0x48,0x41,0x4F,0x50,0x4D,0x54,0x58,0x42,0x4E,0x22};
	const unsigned char PC[20]={0xF1,0xE5,0xE0,0xEE,0xF0,0xF5,0xF3,0xD1,0xCA,0xC5,0xCD,0xC0,0xCE,0xD0,0xCC,0xD2,0xD5,0xC2,0xB9,0xAB};
	for(int k=0,i=0;i<qwFileSize;i++,k++){
		int j=0;
		for(;j<20&&SVM[j]!=pbFile[i];j++);
		if(j<20)pbFile[i]=PC[j];
		str[k]=pbFile[i];
		if(pbFile[i]=='\n'){
			str[k]=0;
			m_View+=str;
			m_View+="\r\n";
			k=-1;
		}//if
	}//for
	UpdateData(false);
	FlushViewOfFile(pbFile, 0);// синхронизируем с диском - конвертировали-то в человеческую кодировку
Ответить