VS2008,C++程序,Unicode模式下读取txt内容到CString出现的问题
#include"stdafx.h"#include<afx.h>#include<iostream>usingnamespacestd;int_tmain(intarg...
#include "stdafx.h"
#include<afx.h>
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
CFile file;
if (!file.Open(L"聊天记录.txt",CFile::modeRead)) //从“聊天记录.txt”里读取
return false;
CArchive ar(&file,CArchive::load);
CString jilu;
ar.ReadString(jilu);
ar.Close();
wchar_t* jiluP=jilu.GetBuffer();
char* p=(char*)jiluP;
cout<<p<<endl;
return 0;
}
当聊天记录.txt里面的内容为abc的时候,为什么jilu里面的内容为ab呢?c为什么被截掉了?怎么解决这个问题?
输出结果为ab 展开
#include<afx.h>
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
CFile file;
if (!file.Open(L"聊天记录.txt",CFile::modeRead)) //从“聊天记录.txt”里读取
return false;
CArchive ar(&file,CArchive::load);
CString jilu;
ar.ReadString(jilu);
ar.Close();
wchar_t* jiluP=jilu.GetBuffer();
char* p=(char*)jiluP;
cout<<p<<endl;
return 0;
}
当聊天记录.txt里面的内容为abc的时候,为什么jilu里面的内容为ab呢?c为什么被截掉了?怎么解决这个问题?
输出结果为ab 展开
2个回答
展开全部
文件的读写还涉及到文件的编码问题,最常见的莫过于UNICODE和ANSI了,因此你用ReadString读取一行当然会出错.
参考以前写的一个:
bool CReadFile::ReadLine(char* buffer, int count)
{
assert(fp);
assert((buffer)&&count>0);
if(feof(fp))
return false;
string s;
if(GetFileCodeType()==ansi)//单字节文件
{
char c;
while(!feof(fp))
{
c=fgetc(fp);
if(c==13)
{
fgetc(fp);//跳过一个字节char(10)
break;
}
s.append(1,c);
}
}
else //宽字节编码文件
{
if(GetPos()==0)
fseek(fp,2,0);//跳过文件开始的编码声明的两个字节
wchar_t wc;
wstring ws;
while(!feof(fp))
{
fread(&wc,1,2,fp);
locale loc("chs");
wcout.imbue(loc);
if(wc==0x000A)
break;
ws.append(1,wc);
}
CUser u;
s=u.WstringToString(ws);
}
int len=s.size();
if(len>count)//截断处理
len=count;
memcpy(buffer,s.c_str(),len);
buffer[len]='\0';
return true;
}
参考以前写的一个:
bool CReadFile::ReadLine(char* buffer, int count)
{
assert(fp);
assert((buffer)&&count>0);
if(feof(fp))
return false;
string s;
if(GetFileCodeType()==ansi)//单字节文件
{
char c;
while(!feof(fp))
{
c=fgetc(fp);
if(c==13)
{
fgetc(fp);//跳过一个字节char(10)
break;
}
s.append(1,c);
}
}
else //宽字节编码文件
{
if(GetPos()==0)
fseek(fp,2,0);//跳过文件开始的编码声明的两个字节
wchar_t wc;
wstring ws;
while(!feof(fp))
{
fread(&wc,1,2,fp);
locale loc("chs");
wcout.imbue(loc);
if(wc==0x000A)
break;
ws.append(1,wc);
}
CUser u;
s=u.WstringToString(ws);
}
int len=s.size();
if(len>count)//截断处理
len=count;
memcpy(buffer,s.c_str(),len);
buffer[len]='\0';
return true;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询