C++:读取文本文件到string变量里

发布时间:2024年01月16日

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

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所用的其中一个读取会话文件时用的模块。目前运行情况良好。

文章来源:https://blog.csdn.net/mynjer/article/details/135605275
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。