可以自动读取文本文件的编码

typedef enum TextFileType
{
    TextFileType_ANSI = 0,
    TextFileType_UNICODE,
    TextFileType_UTF8
}TEXTFILETYPE;



TEXTFILETYPE xPub_GetTextFileType(const CString& strFileName, CString& tFileName)
{
    TEXTFILETYPE fileType = TextFileType_ANSI;
    CFile cfile;
    if (cfile.Open(strFileName, CFile::modeRead | CFile::shareDenyWrite))
    {
        tFileName = cfile.GetFileName();
        char buf[3];
        cfile.Read(buf, 3);
        if ((unsigned char)buf[0] == 0xFF
            && (unsigned char)buf[1] == 0xFE)
        {
            fileType = TextFileType_UNICODE;
        }
        else if ((unsigned char)buf[0] == 0xEF
            && (unsigned char)buf[1] == 0xBB
            && (unsigned char)buf[2] == 0xBF)
        {
            fileType = TextFileType_UTF8;
        }
        cfile.Close();
    }
    return fileType;
}
//读取文件filepath / tFileName 到 变量 string ss里,成功返回1,失败返回0
BOOL xPub_ReadTextFile(CString filepath, CString& tFileName, string& ss)
{
	ss.clear();
	FILE* f = new FILE();
	TEXTFILETYPE fileType = xPub_GetTextFileType(filepath, tFileName);
	errno_t err = _wfopen_s(&f, filepath, L"rb");
	if (err != 0)
		return 0;

	long length = 0;
	fseek(f, 0, SEEK_END);
	length = ftell(f);
	fseek(f, 0, SEEK_SET);

	if (length <= 0)
	{
		fclose(f);
		return 0;
	}

	char* buf; 
	switch (fileType)
	{
	case TextFileType_ANSI:
		break;
	case TextFileType_UNICODE:
		length -= 2;
		fseek(f, 2, 0);
		break;
	case TextFileType_UTF8:
		length -= 3;
		fseek(f, 3, 0);
		break;
	default:
		break;
	}
	buf = new char[length + 1];
	buf[0] = 0;
	int fl = fread(buf, length, 1, f);
	if (fl != 1) {
		fclose(f);
		delete[] buf;
		return 0;
	}
	fclose(f);
	ss.append(buf, length);
	delete(buf);
	return 1;
}

自己的VxTerm所用的其中一个读取会话文件时用的模块。目前运行情况良好。