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

目录
相关文章
|
6月前
|
编译器 C语言 C++
C++中.h和.hpp文件有什么区别?
C++中.h和.hpp文件有什么区别?
|
编译器 程序员 C语言
C++头文件和std命名空间
C++ 是在C语言的基础上开发的,早期的 C++ 还不完善,不支持命名空间,没有自己的编译器,而是将 C++ 代码翻译成C代码,再通过C编译器完成编译。 这个时候的 C++ 仍然在使用C语言的库,stdio.h、stdlib.h、string.h 等头文件依然有效;此外 C++ 也开发了一些新的库,增加了自己的头文件,例如: iostream.h:用于控制台输入输出头文件。 fstream.h:用于文件操作的头文件。 complex.h:用于复数计算的头文件。 和C语言一样,C++ 头文件仍然以.h为后缀,它们所包含的类、函数、宏等都是全局范围的。 后来 C++ 引入了命名空间的概
109 0
|
C++
万能头文件#include<bits/stdc++.h>
#include<bits/stdc++.h>这个头文件的含义
374 1
【C++的万能超级无敌头文件 #include <bits/stdc++.h> 】
【C++的万能超级无敌头文件 #include <bits/stdc++.h> 】
|
C语言 C++
VS2019 添加bits/stdc++.h万能头文件库
VS2019 添加bits/stdc++.h万能头文件库
925 0
VS2019 添加bits/stdc++.h万能头文件库
|
编译器 C++
万能头文件#include“bits/stdc++.h”
万能头文件#include“bits/stdc++.h”
389 0