转载一篇C++文件流处理中文路径问题的方法。

http://www.cnblogs.com/upendi/archive/2013/05/10/3072195.html

【以下内容转自:我住包子山 让VS2005中的fstream支持中文路径文件打开 】

  前几天发了这篇《用fstream对二进制文件的读写》,有朋友指出了VS2005的fstream对于中文路径支持不好的bug。我想大概是因为VS2005更加重视了对字符串的全球化支持,所以鼓励我们使用unicode编码的字符串,对于MBCS之类的支持可能就疏忽了吧。

  我搜索了一下这个问题的解决,参考了如下资料写了演示代码。

  • fstream 和 中文路径  c++博客
  • About unicode settings in visual studio 2005, it really puzzled me a lot ms forum
  • MSDN

我综合了以上的内容,总结了3种方法,能够较好解决大家的困扰,包括可能无法使用cout的问题。

  PS: 补充一下,第一种方法,如果不是静态字符串当作路径的话,记得传入TCHAR*类型字符串作为路径,应该就没问题了。

/********************************************************************
*    created:    2008/05/10
*    created:    10:5:2008   23:56
*    filename:     k:\sj\fstreamTest\fstreamTest\main.cpp
*    file path:    k:\sj\fstreamTest\fstreamTest
*    file base:    main
*    file ext:    cpp
*    author:        Gohan
*********************************************************************/
#include <tchar.h>
#include <fstream>
#include <iostream>
using namespace std;
int main()
{/************************************************************************//* 方法1,使用_TEXT()宏定义将字符串常量指定为TCHAR*类型                 *//* 如果是我,首选此类型                                                 *//************************************************************************/fstream file;file.open(_TEXT("c:\\测试\\测试文本.txt"));cout<<file.rdbuf();file.close();/************************************************************************//* 方法2,使用STL中的locale类的静态方法指定全局locale                   *//* 使用该方法以后,cout可能不能正常输出中文,十分蹊跷                    *//* 我发现了勉强解决的方法:不要在还原区域设定前用cout或wcout 输出中文   *//* 否则后果就是还原区域设定后无法使用cout wcout输出中文                 *//************************************************************************/locale::global(locale(""));//将全局区域设为操作系统默认区域file.open("c:\\测试\\测试文本2.txt");//可以顺利打开文件了locale::global(locale("C"));//还原全局区域设定cout<<file.rdbuf();file.close();/************************************************************************//* 方法3,使用C函数setlocale,不能用cout输出中文的问题解决方法同上      *//************************************************************************/setlocale(LC_ALL,"Chinese-simplified");//设置中文环境file.open("c:\\测试\\测试文本3.txt");//可以顺利打开文件了setlocale(LC_ALL,"C");//还原cout<<file.rdbuf();file.close();
}

【我的编写结果和结论】

  前面的对错暂且不论。(事实上我用过其中的方法,大致是可行的,而且从代码风格和严谨的布局注释来看,作者必成牛人!)
  1. C++流处理是不支持中文字符的。包括标准以及非标准流输入、输出、以读、写方式打开文件名、以及操作文件的路径。
  2. C++的流处理以二进制读写,“endl” 符号用txt打开后,只能看见一个黑方块。
  3. C++文件以单个字符方式读写,会把换行符丢失。

【code 1】测试code1

#include <iostream>
#include <fstream>
#include <string>
#include <locale>#include <windows.h>using namespace std;
int main()
{locale &loc=locale::global(locale(locale(),"",LC_CTYPE));  // 不论以输出文件流还是输入文件流,此操作应放在其两边 ifstream ofs(".\\op\\工作所得.txt");wifstream wofs(L".\\op\\工作所得1.txt"); // 当前目录开始locale::global(loc);  string bs;char ba[1024];ofs.getline(ba, 1024);cout << ba;//ofs<<"test测试"<<1234<<endl;//wofs<<L"Another test还是测试"<<1234<<endl;return 0;
}

【code2】 这个是我最终的成果的简单版本。(为我解决一大概40M的总代码汇总,分开汇总零散的运行近30分钟)

#include <iostream>
#include <fstream>
#include <string>
#include <locale>#include <windows.h>using namespace std;int main(int argc, _TCHAR* argv[])
{WIN32_FIND_DATA FindFileData;HANDLE hFind = FindFirstFile(_T(".\\op\\*.*"), &FindFileData); // 查找当前目录下op目录里的所有文件if (hFind == INVALID_HANDLE_VALUE) {        cout << "find file err" << endl;    return 0;    } else {    FindNextFile(hFind, &FindFileData); // . 点目录FindNextFile(hFind, &FindFileData); // .. 两点目录。 放在循环外面do{char tempchar[1024];string cs_infilename = ".\\op\\" ;cs_infilename += FindFileData.cFileName;// 此操作放在打开操作两侧。(我原来是把out放在程序最前头,只打开一次。in放在中间每循环一次打开一次。当时没成功!!!后来改成了追加模式)locale &loc=locale::global(locale(locale(),"",LC_CTYPE));  ofstream out("unicom.txt", ios_base::app);ifstream in(cs_infilename.c_str());locale::global(loc); cout <<"// " << cs_infilename.c_str()<<endl;    // 在控制台显示操作效果out <<"// " << cs_infilename.c_str()<<endl;        // 文件内注释文件名if (!in.is_open()) { cout << "Error opening in file: " << cs_infilename <<endl; exit (1);}string infilebuffer;while (getline(in,infilebuffer)){out << infilebuffer <<endl;cout << infilebuffer <<endl;}out <<"// END: " << cs_infilename.c_str()<<endl; // END:文件内注释文件名out.close();in.close();}while (FindNextFile(hFind, &FindFileData) != 0);}FindClose(hFind);return 0;
}

转载于:https://my.oschina.net/abcijkxyz/blog/722482

C++fstream文件流处理对中文字符不支持的解决办法相关推荐

  1. SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;

    SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码; 参考文章: (1)SpringMVC项目中中 ...

  2. mysql保存中文乱码的原因和解决办法

    当你遇到这个mysql保存中文乱码问题的时候,期待找到mysql保存中文乱码的原因和解决办法这样一篇能解决问题的文章是多么激动人心.   也许30%的程序员会选择自己百度,结果发现网友已经贴了很多类似 ...

  3. html里显示中文乱码的原因及解决办法

    html里显示中文乱码的原因及解决办法 我试着写第一个html文件时候,发现打开保存的html文件后,中文显示的是乱码的.我知道这是字符编码的原因,发现要在开头统一规范下编码格式,通常charset的 ...

  4. mysql保存时乱码了_MySQL保存中文乱码的原因和解决办法

    (3)MySQL的字符集设置. 这个是重点了,一般都是在这里搞错而出现了mysql乱码. mysql编码设置可以分为三种设置:数据库的编码.表的编码.和字段的编码. a.数据库的编码: 在sqlyog ...

  5. 【50关于Visual Studio 2019控制台输出中文出现乱码问题及解决办法】

    文章目录 关于Visual Studio 2019控制台输出中文出现乱码问题及解决办法 1.从.txt文件中读取输出出现乱码 2.从中文字符串中读取输出出现乱码 关于Visual Studio 201 ...

  6. Android之AndroidStudio输入中文不提示候选字解决办法

    Android之AndroidStudio输入中文不提示候选字解决办法 前段时间用AndroidStudio用的好好的,不知道从啥时候开始,AndroidStudio里面输入中文居然出现跳行或者其它一 ...

  7. 【教程】关于打开一些exe文件时,打开方式为microsoft store的解决办法

    [教程]关于打开一些exe文件时,打开方式为microsoft store的解决办法 前言 解决 ---------------- 版权声明:本文为CSDN博主「SogK1997」的原创文章,遵循CC ...

  8. 记一次mysql数据库转储sql文件到另外一台电脑运行失败的解决办法

    记一次mysql数据库转储sql文件到另外一台电脑运行失败的解决办法 将转储的sql文件中创建触发器相关的语句剪切复制到另外的一份文本,保存重新运行sql文件,成功后在把之前剪切的语句复制过来在运行一 ...

  9. Keil MDK 工程输入中文汉字编译报错解决办法

    Keil MDK 工程输入中文汉字编译报错解决办法 官方说明:https://www.keil.com/support/man/docs/armcc/armcc_chr1359124934197.ht ...

最新文章

  1. 华为:憧憬6G,共同定义6G
  2. c语言100以内加减乘除,一百以内的加减乘除法游戏....
  3. 【hiho】38 二分·二分答案【二分答案】
  4. Python编程基础:第五十九节 守护线程Daemon Threading
  5. 无线网络拓扑结构简析
  6. 前端学习(1620):前端系列实战课程之提取行间样式
  7. 图神经网络让预估到达准确率提升50%,谷歌地图实现新突破
  8. nginx访问日志 logstash 配置文件实例2
  9. java 查询sql_Java 中如何使用 SQL 查询文本
  10. 固态硬盘系统经常假死_使用固态硬盘装Win10经常假死怎么解决
  11. linux模拟系统宕机,Linux系统宕机的处理方法
  12. 如何保持精力充沛_在家工作,如何管理一支精力充沛,精力充沛的日常团队,远程站起来...
  13. 海伦公式计算三角形面积 C++
  14. ESP8266开发之旅 进阶篇⑩ sniffer混杂模式,监听802.11帧,黑科技基础
  15. LintCode 78: Longest Common Prefix
  16. win7 64位 nssm安装windows服务
  17. [分享]高仿网易新闻WebApp模板+Dcloud打包源码下载
  18. RPGJS 进阶分析之 如何使用RMXP导出的数据
  19. asp.net学生成绩管理系统VS开发sqlserver数据库web结构
  20. PyPI 仓库被曝多个 typosquatting 库,可触发供应链攻击

热门文章

  1. 计算机毕业设计Android家教平台软件app(源码+系统+mysql数据库+Lw文档)
  2. RabbitMQ实战 : 抢单系统并发解决方案
  3. 朋友圈设置成昨天发的_我终于将朋友圈设置成了三天可见!
  4. 51单片机模拟I2C协议
  5. 软件著作权使用许可种类
  6. 学习笔记-《GPU 编程与CG 语言之阳春白雪下里巴人》
  7. 2021年塔式起重机司机考试题库及塔式起重机司机新版试题
  8. CSS3-实现翻书效果
  9. 店大欺客的Twitter
  10. 【无标题】求解Java 勇者斗恶龙