MFC读写txt文本文件

时间:2023-01-23 23:48:08
VS2010 MFC读写txt文本文档,采用的是CStdioFile类操作,用ReadString和WriteString函数按行读写,但是txt中的特殊字符比如
kΩ这样的读出来是乱码,在MFC里用字符串变量定义 str=_T("kΩ")然后写进txt里面也显示是乱码,求大神们指点一下该怎么修改啊?

7 个解决方案

#1


项目用 UNICODE 方式 编译

#2



try
{
LPCWSTR lpszText = L"10 kΩ";
CFile file(TEXT("F:\\11.txt"), CFile::modeCreate | CFile::modeWrite);
BYTE byUnicode[] = { 0xFF, 0xFE };
file.Write(byUnicode, sizeof(byUnicode));
file.Write(lpszText, wcslen(lpszText) * sizeof(WCHAR));
file.Close();
}
catch (CException* e)
{
e->ReportError();
e->Delete();
}

#3


应该是多字节字符的转化问题,可以换成用 UNICODE 方式 编译或者用MultiByteToWideChar进行转化。

#4


引用 1 楼 zgl7903 的回复:
项目用 UNICODE 方式 编译
用的就是unicode呀

#5


引用 2 楼 VisualEleven 的回复:

try
{
LPCWSTR lpszText = L"10 kΩ";
CFile file(TEXT("F:\\11.txt"), CFile::modeCreate | CFile::modeWrite);
BYTE byUnicode[] = { 0xFF, 0xFE };
file.Write(byUnicode, sizeof(byUnicode));
file.Write(lpszText, wcslen(lpszText) * sizeof(WCHAR));
file.Close();
}
catch (CException* e)
{
e->ReportError();
e->Delete();
}
那要读txt里面的字符"kΩ"要怎么写呢

#6



try
{
WCHAR szText[16] = { 0 };

CFile file(TEXT("F:\\11.txt"), CFile::modeRead);
file.Seek(2, CFile::begin); // Skip 0xFF, 0xFE
file.Read(szText, sizeof(szText));
file.Close();

AfxMessageBox(CString(szText));
}
catch (CException* e)
{
e->ReportError();
e->Delete();
}

#7


使用函数进行转换:从TXT读出后 ANSI向UNCODE转换,写入时反过来转换。
函数

// ANSI To UNCODE转换
CString AnsiToUnicode(char * szAnsi, int len=0);
// Unicod To ANSI转换
int UnicodToAnsi(CString str,char* buff);



// ANSI To UNCODE转换
CString CXXXX::AnsiToUnicode(char * szAnsi, int len)
{
CString str;
// ansi to unicode
//预转换,得到所需空间的大小
int wcsLen;
if(len>0)
wcsLen=len;
else
wcsLen= ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
wchar_t* wszString = new wchar_t[wcsLen + 1];
//转换
::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
//最后加上'\0'
wszString[wcsLen] = '\0'; // UNICODE字串
str=wszString;
delete[] wszString;
return str;
}

// Unicod To ANSI转换
int CXXXX::UnicodToAnsi(CString str,char* buff)
{
int len=0;
// UNICODE编码 转换成 ANSI编码
len = ::WideCharToMultiByte(CP_ACP, NULL, str, 
str.GetLength(), NULL, 0, NULL, NULL); // 取字串长度
::WideCharToMultiByte(CP_ACP, NULL, str, str.GetLength(), 
buff, len, NULL, NULL);
buff[len++]=0x00; // 写字串尾部结束标志

return len; // 转换长度
}

引用例:

CStringProc sp;
CString IP=sp.AnsiToUnicode(pip);


char cf[640];
CStringProc sp;

// 语音文件检查
sp.UnicodToAnsi(fName,cf);

#1


项目用 UNICODE 方式 编译

#2



try
{
LPCWSTR lpszText = L"10 kΩ";
CFile file(TEXT("F:\\11.txt"), CFile::modeCreate | CFile::modeWrite);
BYTE byUnicode[] = { 0xFF, 0xFE };
file.Write(byUnicode, sizeof(byUnicode));
file.Write(lpszText, wcslen(lpszText) * sizeof(WCHAR));
file.Close();
}
catch (CException* e)
{
e->ReportError();
e->Delete();
}

#3


应该是多字节字符的转化问题,可以换成用 UNICODE 方式 编译或者用MultiByteToWideChar进行转化。

#4


引用 1 楼 zgl7903 的回复:
项目用 UNICODE 方式 编译
用的就是unicode呀

#5


引用 2 楼 VisualEleven 的回复:

try
{
LPCWSTR lpszText = L"10 kΩ";
CFile file(TEXT("F:\\11.txt"), CFile::modeCreate | CFile::modeWrite);
BYTE byUnicode[] = { 0xFF, 0xFE };
file.Write(byUnicode, sizeof(byUnicode));
file.Write(lpszText, wcslen(lpszText) * sizeof(WCHAR));
file.Close();
}
catch (CException* e)
{
e->ReportError();
e->Delete();
}
那要读txt里面的字符"kΩ"要怎么写呢

#6



try
{
WCHAR szText[16] = { 0 };

CFile file(TEXT("F:\\11.txt"), CFile::modeRead);
file.Seek(2, CFile::begin); // Skip 0xFF, 0xFE
file.Read(szText, sizeof(szText));
file.Close();

AfxMessageBox(CString(szText));
}
catch (CException* e)
{
e->ReportError();
e->Delete();
}

#7


使用函数进行转换:从TXT读出后 ANSI向UNCODE转换,写入时反过来转换。
函数

// ANSI To UNCODE转换
CString AnsiToUnicode(char * szAnsi, int len=0);
// Unicod To ANSI转换
int UnicodToAnsi(CString str,char* buff);



// ANSI To UNCODE转换
CString CXXXX::AnsiToUnicode(char * szAnsi, int len)
{
CString str;
// ansi to unicode
//预转换,得到所需空间的大小
int wcsLen;
if(len>0)
wcsLen=len;
else
wcsLen= ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
wchar_t* wszString = new wchar_t[wcsLen + 1];
//转换
::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
//最后加上'\0'
wszString[wcsLen] = '\0'; // UNICODE字串
str=wszString;
delete[] wszString;
return str;
}

// Unicod To ANSI转换
int CXXXX::UnicodToAnsi(CString str,char* buff)
{
int len=0;
// UNICODE编码 转换成 ANSI编码
len = ::WideCharToMultiByte(CP_ACP, NULL, str, 
str.GetLength(), NULL, 0, NULL, NULL); // 取字串长度
::WideCharToMultiByte(CP_ACP, NULL, str, str.GetLength(), 
buff, len, NULL, NULL);
buff[len++]=0x00; // 写字串尾部结束标志

return len; // 转换长度
}

引用例:

CStringProc sp;
CString IP=sp.AnsiToUnicode(pip);


char cf[640];
CStringProc sp;

// 语音文件检查
sp.UnicodToAnsi(fName,cf);