std::fstream 中文路径

简介: std::fstream 中文路径 eryar@163.com 用C++来开发管道出图程序IsoAlgo时,当PCF文件名中包含中文时,读取文件会失败。将下面数据存成一个简单文件:中文.txt  放到目标目录中来测试: Figure 1 包含中文的文件 简单测试程序代码如下所示: #i...

std::fstream 中文路径

eryar@163.com

用C++来开发管道出图程序IsoAlgo时,当PCF文件名中包含中文时,读取文件会失败。将下面数据存成一个简单文件:中文.txt  放到目标目录中来测试:

wps_clip_image-28291

Figure 1 包含中文的文件

简单测试程序代码如下所示:

#include  < fstream >
#include 
< cassert >
#include 
< iostream >

int  main( int  argc,  char *  argv[])
{
    std::ifstream aFile(argv[
1 ]);

    assert(aFile.good());

    std::cout 
<<  aFile.rdbuf()  <<  std::endl;

    
return   0 ;
}

并在Visual Studio的命令参数中传进去文件名:

wps_clip_image-21877

Figure 2 Set Command Arguments

运行程序,会得到如下错误提示窗口:

wps_clip_image-429

Figure 3 assert for the file

这是加上断言assert的效果,在Debug模式下可以很快定位到错误,而在Release模式下就把这一行代码忽略了。

在网上搜了下std::ifstream读取中文文件名的文件的解决方案:

v 使用C语言的函数设置成中文运行环境:

setlocale(LC_ALL, " Chinese-simplified " );

v 使用STL中的函数设置为系统语言环境:

std::locale::global(std::locale( "" ));

因为IsoAlgo使用了STL的C++,所以选择方案2。实现代码如下所示:

#include  < fstream >
#include 
< cassert >
#include 
< iostream >

int  main( int  argc,  char *  argv[])
{
    std::locale::global(std::locale(
"" ));
    std::ifstream aFile(argv[
1 ]);
    std::locale::global(std::locale(
" C " ));

    assert(aFile.good());

    std::cout 
<<  aFile.rdbuf()  <<  std::endl;

    
return   0 ;
}

程序运行结果如下图所示:

wps_clip_image-11274

目录
相关文章
|
算法 编译器 C++
【C++】—— c++11新特性之 lambda
【C++】—— c++11新特性之 lambda
238 0
|
网络协议 Linux
Linux下connect函数 阻塞 与 非阻塞 问题
Linux下connect函数 阻塞 与 非阻塞 问题
976 0
|
编解码 C语言
FFMPEG 获取视频PTS
FFMPEG 获取视频PTS
300 0
|
编译器
Qt没有被正确安装,请运行make install -- 问题的解决办法
Qt没有被正确安装,请运行make install -- 问题的解决办法
1664 0
|
存储 编解码 缓存
【ffmpeg 移动视频流位置】深入理解FFmpeg:精细探讨seek操作和编解码上下文
【ffmpeg 移动视频流位置】深入理解FFmpeg:精细探讨seek操作和编解码上下文
840 0
|
存储 传感器 Java
格雷码(Gray Code)
格雷码(Gray Code)是一种二进制编码方式,它使用两种不同状态的信号(通常为 0 和 1)来表示二进制位。与普通的二进制编码不同,格雷码相邻的两个二进制位之间只相差一个比特。例如,对于 4 位二进制数,格雷码可以是 0000、0001、0011、0100、0101、0110、1000、1001、1010、1011、1100、1101、1110 和 1111。
3558 1
|
计算机视觉
OpenCV_10 傅里叶变换:频域滤波+CV的应用
傅里叶变换是由法国的一位数学家Joseph Fourier在18世纪提出来的,他认为:任何连续周期的信号都可以由一组适当的正弦曲线组合而成。
501 0
OpenCV_10 傅里叶变换:频域滤波+CV的应用
|
容器
yuv色彩空间和色彩范围
yuv色彩空间和色彩范围
749 0

热门文章

最新文章