1. 程式人生 > >記錄fstream類讀取UTF-8時出現亂碼問題以及fstream讀檔案的幾種方法

記錄fstream類讀取UTF-8時出現亂碼問題以及fstream讀檔案的幾種方法

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;
}