#include <iostream>
#include <assert.h>
#include <fstream>
#include <string>
#include <string.h>
using namespace std; #ifdef _WIN32
#include <Windows.h>
#endif typedef enum FileType
{
FileType_ANSI = ,
FileType_UNICODE,
FileType_UTF8
}FILETYPE; #ifdef _WIN32
string UTF8ToGB(const char* str);
#endif FILETYPE GetTextFileType(const std::string & strFileName);
string ReadTextFile(const std::string & strFileName); int main()
{
string json = ReadTextFile("/tmp/a.json"); getchar(); return ;
} FILETYPE GetTextFileType(const std::string & strFileName)
{
FILETYPE fileType = FileType_ANSI;
std::ifstream file;
file.open(strFileName.c_str(), std::ios_base::in);
bool bUnicodeFile = false; if (file.good())
{
char szFlag[] = { };
file.read(szFlag, sizeof(char) * );
if ((unsigned char)szFlag[] == 0xFF
&& (unsigned char)szFlag[] == 0xFE)
{
fileType = FileType_UNICODE;
}
else if ((unsigned char)szFlag[] == 0xEF
&& (unsigned char)szFlag[] == 0xBB
&& (unsigned char)szFlag[] == 0xBF)
{
fileType = FileType_UTF8;
}
} file.close();
return fileType;
} string ReadTextFile(const std::string & strFileName)
{
FILETYPE fileType = GetTextFileType(strFileName);
if (fileType != FileType_UTF8)
{
cout << "UTF-8 file needed!" << endl;
return "";
} FILE * fp = NULL;
fp = fopen(strFileName.c_str(), "rb");
fseek(fp, , SEEK_END);
size_t size = ftell(fp);
fseek(fp, , SEEK_SET); std::string result; if (fp != NULL)
{
// UTF-8 file should offset 3 byte from start position.
fseek(fp, sizeof(char) * , );
int buferSize = (int)size - ;
char* szBuf = new char[buferSize + ];
memset(szBuf, , sizeof(char) * (buferSize + ));
fread(szBuf, sizeof(char), buferSize, fp);
result.append(szBuf);
delete szBuf;
} fclose(fp); #ifdef _WIN32
result = UTF8ToGB(result.c_str());
#endif return result;
} #ifdef _WIN32
string UTF8ToGB(const char* str)
{
string result;
WCHAR *strSrc;
LPSTR szRes; int i = MultiByteToWideChar(CP_UTF8, , str, -, NULL, );
strSrc = new WCHAR[i + ];
MultiByteToWideChar(CP_UTF8, , str, -, strSrc, i); i = WideCharToMultiByte(CP_ACP, , strSrc, -, NULL, , NULL, NULL);
szRes = new CHAR[i + ];
WideCharToMultiByte(CP_ACP, , strSrc, -, szRes, i, NULL, NULL); result = szRes;
delete[]strSrc;
delete[]szRes; return result;
}
#endif

c++ 读取 utf-8 文件到 string的更多相关文章

  1. InputStream读取文件到string后OutputStream到文件,按String和Bytes拷贝

    http://www.iteye.com/problems/72150 写了一段代码 大体是 InputStream读取文件到string后OutputStream到文件 遇到的问题为TXT文件大小格 ...

  2. 读取本地json文件,转出为指定格式json 使用Base64进行string的加密和解密

    读取本地json文件,转出为指定格式json   引用添加Json.Net 引用命名空间 using Newtonsoft.Json //读取自定目录下的json文件StreamReader sr = ...

  3. .NET Core的文件系统[1]:读取并监控文件的变化

    ASP.NET Core 具有很多针对文件读取的应用.比如我们倾向于采用JSON文件来定义配置,所以应用就会涉及针对配置文件读取.如果用户发送一个针对物理文件的HTTP请求,应用会根据指定的路径读取目 ...

  4. Java基础-输入输出-2.编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt

    2.编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt ...

  5. 编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt

    package zuoye; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcep ...

  6. POI读取/写入Excel文件

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

  7. iOS案例:读取指定txt文件,并把文件中的内容输出出来

    用到的是NSString中的initWithContentsOfFile: encoding方法 // // main.m // 读取指定文件并输出内容 // // Created by Apple ...

  8. 使用HttpWebRequest以及HttpWebResponse读取Http远程文件

     主页>杂项技术>.NET(C#)> 使用HttpWebRequest以及HttpWebResponse读取Http远程文件 jackyhwei 发布于 2010-08-15 21: ...

  9. JCIFS读取远程服务器文件过慢的解决方法

    JCIFS读取远程服务器文件过慢的解决方法 发表于3年前(2013-07-12 11:23)   阅读(1174) | 评论(0) // 我要收藏"; var favor_del = &qu ...

  10. JNI读取assets资源文件

    源自:http://www.rosoo.net/a/201112/15459.html assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取 ...

随机推荐

  1. 【转】Android编译系统详解(一)——build/envsetup.sh

    出处 http://www.cloudchou.com/android/post-134.html 本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 准备好编译环境后,编译Rom的 ...

  2. [易学易懂系列|rustlang语言|零基础|快速入门|(9)|Control Flows流程控制]

    [易学易懂系列|rustlang语言|零基础|快速入门|(9)] 有意思的基础知识 Control Flows 我们今天再来看看流程控制. 条件控制 if-else if -else: / Simpl ...

  3. robotframework 使用Chrome手机模拟器两种方法

    Open Google Simulator1 ${device metrics}= Create Dictionary width=${360} height=${640} pixelRatio=${ ...

  4. 深入理解JAVA虚拟机 虚拟机执行子系统

    class类文件的结构 java的class类文件中存在两种结构:无符号数和表.最小的存储单元是8个字节. 无符号数是基本的数据类型,用来描述数字,UTF-8编码的字符串,索引引用. 表示多个无符号数 ...

  5. ZROI 19.08.02 杂题选讲

    给出\(n\)个数,用最少的\(2^k\)或\(-2^{k}\),使得能拼出所有数,输出方案.\(n,|a_i|\leq 10^5\). 显然一个绝对值最多选一次.这个性质非常强. 如果所有都是偶数, ...

  6. 【react学习一】首先先create-react-app 配置less、sass

    1.安装初始化 npm create-react-app react-demo 2.安装初始化 npm run eject 3.配置sass / less cnpm i sass-loader nod ...

  7. Python---面向对象的三大特征

    # 面向对象的三大特征 - 继承 - 封装 - 多态 # 继承 - 子类可以使用父类定义的内容或者行为等 - 继承的实现 - 父类:基类,超类:被继承的类, Base Class, Super Cla ...

  8. 参数上使用自定义注解在aop中无法获取到该参数

    https://ask.csdn.net/questions/769477 /** * 环绕增强,验证权限 * @param joinPoint 目标对象 * @param authCheck 自定义 ...

  9. QT 问题提问网站

    https://stackoverflow.com/questions/tagged/qt

  10. ASP.NET如何实现断点续传的上传、下载功能?

    1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通 ...