请问如何逐行读取UNICODE的文本? 被CStdioFile的ReadString不认UNICODE搞得很痛苦,参照了N多例子都弄不出来,前面的帖子也盼望有个答案,过两天结账。求实现过程,文件是UNICODE的,总之逐行读出来没乱码就行,WCHAR or char[]还是CString都没关系(CString好一些),我自个儿再去转换MFC还是STL或纯C都可以。叩谢!!!!!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己用CreateFile打开文件,ReadFile来读啊,为啥一定要用CStdioFile来读呢如果已经确认目标文件是unicode编码,每次读偶数字节就不会乱码 不是告诉你了么,Unicode文件是无法用CStdioFile读的,这样也间接说明无法逐行读,因为unicode文件不能以typeText方式打开,既然连打开都不行,何来逐行?这种文件似乎只能用二进制方式打开,全部读进来,然后自己再分行 谢谢,我另外一边也试试二进制???这样的内容显示null... CString tempStr; ifstream in("\\123.txt"); string s; while(getline(in,s)) { tempStr.Format(_T("%s"),s); AfxMessageBox(tempStr); }再底层的方法就不知道从何入手了。 CStdioFile file(L"c:\\u.txt", CFile::modeRead | CFile::typeBinary); CString str; while (file.ReadString(str)) { AfxMessageBox(str); }c:\u.txt - unicode文件 内容是cvnladsvndkvj阿訇在cascvsdvsdcnakjcn55!!!!Zslkcfadsnsdv, dfm;lsdvm;用记事本输入上述内容另存为unicode文本 运行了一下 没有看到你说的乱码 看文章不要只看几个字,你只看到“二进制”,没有看到“不能按行读”你应该用read之类得函数把整个文件读进来,然后找\r\n 假定你的Unicode文件是UTF-16编码,且没有BOM,只以换行符为行结束标记:int main(){ FILE *hFile=0; wchar_t buff[1000]; int i=0; hFile=fopen("c:\\abc.txt","rb"); while(true) { buff[i]=fgetwc(hFile); if (buff[i]==L'\n'||feof(hFile)) { buff[i]=0; //buf为一行文本,处理 i=0; } if(feof(hFile)) break; i++; } fclose(hFile); return 0; 用CFile就可以了,用WCHAR 数组Read,关键是字节数要算对至于换行的话,根据“\r\n”即可判断了明天给你段代码吧 扩展CStdioFile类,支持Unicode. CFile file; TCHAR* pFileName = _T("TEST.txt");if(!file.Open(pFileName, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeRead| CFile::typeBinary | CFile::shareDenyNone)) { MessageBox(_T("打开TEST.txt文件失败!")); } DWORD len=file.GetLength(); TCHAR *pContent= new TCHAR[len/2+1];//UNICODE文件必须用TCHAR来读 memset(pContent,0,len); // (第一个字符0xfeff,实际有用的为后面字符) file.Seek(0,CFile::begin);// file.Read(pContent,len); file.Close(); 关于文档/视图类新建问题 怎么得到已打开的那些文件的全路径 [求助]帮忙看看如下代码! 如何实时通知子线程让其关闭? 求助:关于《科学与工程数值计算算法(Visual C++版)》书中CMatrix类的部分的源码 请问,我怎么能把一个服务的状态由自动变成禁用??? 我是一个30岁的人,也没有太多的编程经验,仅仅曾编过一些FOXPRO的程序。不知我现在立志做编程是否还来得及?请业内人士指点,多谢! 关于多语言版本的问题 如何实现动态图标? mfc通过ado操作数据库的几个问题 求MFC图库 关于餐饮票据打印机 人民币求解
如果已经确认目标文件是unicode编码,每次读偶数字节就不会乱码
谢谢,我另外一边也试试二进制???这样的内容显示null... CString tempStr;
ifstream in("\\123.txt");
string s; while(getline(in,s))
{
tempStr.Format(_T("%s"),s);
AfxMessageBox(tempStr);
}再底层的方法就不知道从何入手了。
CString str;
while (file.ReadString(str))
{
AfxMessageBox(str);
}c:\u.txt - unicode文件 内容是
cvnladsvndkvj
阿訇在cascvsdvsd
cnakjcn55!!!!Zslkcfadsnsdv, dfm;lsdvm;用记事本输入上述内容另存为unicode文本 运行了一下 没有看到你说的乱码
你应该用read之类得函数把整个文件读进来,然后找\r\n
int main()
{
FILE *hFile=0;
wchar_t buff[1000];
int i=0;
hFile=fopen("c:\\abc.txt","rb");
while(true)
{
buff[i]=fgetwc(hFile);
if (buff[i]==L'\n'||feof(hFile))
{
buff[i]=0; //buf为一行文本,处理
i=0; }
if(feof(hFile)) break; i++; }
fclose(hFile);
return 0;
至于换行的话,根据“\r\n”即可判断了
明天给你段代码吧
if(!file.Open(pFileName, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeRead| CFile::typeBinary | CFile::shareDenyNone))
{
MessageBox(_T("打开TEST.txt文件失败!"));
}
DWORD len=file.GetLength();
TCHAR *pContent= new TCHAR[len/2+1];//UNICODE文件必须用TCHAR来读
memset(pContent,0,len);
// (第一个字符0xfeff,实际有用的为后面字符)
file.Seek(0,CFile::begin);//
file.Read(pContent,len);
file.Close();