CStdioFile::ReadString读取txt文本为乱码

有时间也不简史 2015-07-31 03:51:51
程序是这样的:
CString puppet="C:\\.....\\安装.txt";
CStdioFile file;
CFileException fileException;
int res=file.Open(puppet,CFile::typeText | CFile::modeReadWrite,&fileException);
if(res==0)
{
AfxMessageBox("dfdfg");
return;
}
file.SeekToBegin();
CString str1;
file.ReadString(str1);

edit.SetWindowText(str1);

环境是多字节字符集,读取时,我在ReadString处设置断点,为乱码。
即使是环境改为Unicode读取Unicode文本,结果也一样。
之前还试过用CFile读取,代码如下:
CString puppet="C:\\.....\\安装.txt";
CFile file;
int res=file.Open(puppet,CFile::modeReadWrite,NULL);
long length=file.GetLength();
wchar_t * buf=new wchar_t[length+1];
file.SeekToBegin();
int hasRead=file.Read(buf,length);
buf [length]='\0';
file.Close();
同样环境是Unicode字符集,调试时,文本的长度是2048,而最终hasRead也显示为2048,但是buf却是乱码。
求各位大神指点!
...全文
556 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenyi0106 2015-07-31
  • 打赏
  • 举报
回复
你先确定你的文本是不是可见字符。 在确定你的工程字符集设置是否和你的文本内容一致。
schlafenhamster 2015-07-31
  • 打赏
  • 举报
回复
参考:

// CEditStringDoc serialization
void CEditStringDoc::Serialize(CArchive& ar)
{
	BOOL    FirstLine=TRUE;
	WCHAR   wBuf[2048];
	char    szBuf[2048];
	int     i=0;
	BOOL    LineEnd=FALSE;
	char    type[10];
	char    dummy[10];
	char    *pLine=0;
	char    UtfHead[3]={(char)0xEF,(char)0xBB,(char)0xBF};
	char    UniHead[2]={(char)0xFF,(char)0xFE};
//
	memset(type,0,10);
	memset(dummy,0,10);
//
	if (ar.IsStoring())
	{
		// TODO: add storing code here
		int all=m_TextArray.GetSize();
		for (int kk=0;kk<all;kk++)
		{
			strcpy(szBuf,m_TextArray[kk].GetBuffer(2048));
			strcat(szBuf,"\r\n");
			if(FirstLine)
			{
				if		(m_UTF8)	ar.Write(UtfHead,3);
				else if (m_UNICODE)	ar.Write(UniHead,2);
			}// end 1st line
			if(m_UTF8)
			{
				MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
				WideCharToMultiByte(CP_UTF8,0,wBuf,-1,szBuf,2048,0,0);
				ar.Write(szBuf,strlen(szBuf));			
			}
			else if(m_UNICODE)
			{
				MultiByteToWideChar(CP_ACP,0,szBuf,-1,wBuf,2048);
				ar.Write(wBuf,2*wcslen(wBuf));			
			}
			else
			{
				ar.Write(szBuf,strlen(szBuf));			
			}
			FirstLine=FALSE;
		}// end for
	}// end save
	else
	{// if UTF8 file the 1st 3 chars are: EFh,BBh,BFh
	 // if UNICODE file the 1st 2 chars are :FFh,FEh
	 // TODO: add loading code here
		m_TextArray.RemoveAll();
		memset(szBuf,0,sizeof(szBuf));
		while(ar.Read(&szBuf[i],1))
		{//
			if(FirstLine)
			{
				if(	(szBuf[0]!=(char)0xEF) && 
					(szBuf[0]!=(char)0xBB) &&
					(szBuf[0]!=(char)0xBF) &&
					(szBuf[0]!=(char)0xFF) &&
					(szBuf[0]!=(char)0xFE) )
				{// normal file
					m_UTF8=FALSE;
					m_UNICODE=FALSE;
					FirstLine=FALSE;
					i++;
					continue;
				}
				if(	szBuf[0]==(char)0xEF)
				{
					type[0]=szBuf[0];
					continue;
				}
				if(	szBuf[0]==(char)0xBB)
				{
					type[1]=szBuf[0];	
					continue;
				}
				if(	szBuf[0]==(char)0xBF)
				{
					type[2]=szBuf[0];
				}
// Is UTF8 file ?
				if(	(type[0]==(char)0xEF) && 
					(type[1]==(char)0xBB) &&	
					(type[2]==(char)0xBF)  )
				{// UTF8 file
					m_UTF8=TRUE;
					m_UNICODE=FALSE;
					FirstLine=FALSE;
					continue;//i=0
				}
// Is UNICODE file ?
				if(	szBuf[0]==(char)0xFF)
				{
					type[0]=szBuf[0]; 
					continue;
				}
				if(	szBuf[0]==(char)0xFE)
				{
					type[1]=szBuf[0];	
				}
				if(	(type[0]==(char)0xFF) && 
					(type[1]==(char)0xFE) )	
				{
					m_UNICODE=TRUE;
					m_UTF8=FALSE;
					FirstLine=FALSE;
					continue;//i=0
				}
			}// end firstline
// check line end
			if(szBuf[i]==0x0D)
			{// 
				LineEnd=TRUE;
				szBuf[i]=0;
				ar.Read(dummy,1);//00 or 0a 
				if(m_UNICODE)
				{
					ar.Read(dummy,2);//0a 00
				}
			}
//
			if(LineEnd)
			{
				if(m_UTF8)
				{// utf8 file
					MultiByteToWideChar(CP_UTF8,0,szBuf,-1,wBuf,2048);
					WideCharToMultiByte(CP_ACP,0,wBuf,-1,szBuf,2048,0,0);
					pLine=szBuf;			
				}
				else if(m_UNICODE)
				{// Unicode file
					WideCharToMultiByte(CP_ACP,0,(WCHAR *)szBuf,-1,(char *)wBuf,2048,0,0);
					pLine=(char *)wBuf;			
				}
				else
				{// normal file
					pLine=szBuf;			
				}
				LineEnd=FALSE;// new line
//add 
				m_TextArray.Add(pLine);
				memset(szBuf,0,sizeof(szBuf));
				i=-1;// +1=0 szBuf[0]
			}// end LineEnd
			i++;//from 0
		}// end while
// if file end but no LF
		if(szBuf[0]!=0) m_TextArray.Add(szBuf);// last line  
		if(m_TextArray.GetSize()!=0)
		{
			UpdateAllViews(0);
		}
	}
}

mayudong1 2015-07-31
  • 打赏
  • 举报
回复
1. 用记事本打开那个txt文件,看看内容是不是正常的 2. 用记事本打开后另存为一下,另存为的时候可以选择编码方式,将其选择为ANSI 3. 工程字符集设置为多自己,重新执行一下看结果
schlafenhamster 2015-07-31
  • 打赏
  • 举报
回复
“读取Unicode文本” 头3个字节是编码方式 char UtfHead[3]={(char)0xEF,(char)0xBB,(char)0xBF};// UTF8 char UniHead[2]={(char)0xFF,(char)0xFE};//UNICODE16
赵4老师 2015-07-31
  • 打赏
  • 举报
回复
In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired encoding may be passed to fopen when opening a new file or overwriting an existing file, like this: fopen("newfile.txt", "rw, ccs=<encoding>"); Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is already in existence and is opened for reading or appending, the Byte Order Mark (BOM) is used to determine the correct encoding. It is not necessary to specify the encoding with a flag. In fact, the flag will be ignored if it conflicts with the type of the file as indicated by the BOM. The flag is only used when no BOM is present or if the file is a new file. The following table summarizes the modes used in for various flags given to fopen and Byte Order Marks used in the file. Encodings Used Based on Flag and BOM Flag No BOM (or new file) BOM: UTF-8 BOM: UTF-16 UNICODE ANSI UTF-8 UTF-16LE UTF-8 UTF-8 UTF-8 UTF-16LE UTF-16LE UTF-16LE UTF-8 UTF-16LE Generic-Text Routine Mappings TCHAR.H routine _UNICODE & _MBCS not defined _MBCS defined _UNICODE defined
赵4老师 2015-07-31
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了

16,482

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧