1.处理fstream类读取UTF-8时出现乱码问题,思路先将utf-8转换成UNICODE 再转化成ANSI
#include <string>
#include<fstream>
using namespace std;
string changeUTF8ToAnsi(const char * szU8)
{
int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
wchar_t* wszMultiByte = new wchar_t[wcsLen + 1];
::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszMultiByte, wcsLen);
wszMultiByte[wcsLen] = '\0';
int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszMultiByte, wcslen(wszMultiByte), NULL, 0, NULL, NULL);
char* szAnsi = new char[ansiLen + 1];
szAnsi[ansiLen] = '\0';
::WideCharToMultiByte(CP_ACP, NULL, wszMultiByte, wcslen(wszMultiByte), szAnsi, ansiLen, NULL, NULL);
string s=szAnsi;
delete []szAnsi;
delete []wszMultiByte;
return s;
}
2.记录下fstream读取文件
string strFile="E:\\1.TXT";
fstream ifs(strFile);
string line;
while(std::getline(ifs,line))
{
//line 就是每一行内容
}
//或者
while(!ifs.eof())
{
std::getline(ifs,line);
//line 就是每一行内容
}
//一次性读完
std::getline(ifs,line,(char)EOF);
#include <fstream>
int main()
{
const char * filename = "E:\\1.TXT";
char * buffer;
long size;
ifstream in (filename, ios::in|ios::binary|ios::ate);
size = in.tellg();
in.seekg (0, ios::beg);
buffer = new char [size];
in.read (buffer, size);
in.close();
delete[] buffer;
return 0;
}