ifstream & ofstream 打开中文路径失败的解决方案

本文介绍了使用 C++ 的 iostream 库中 ifstream 和 ofstream 类处理包含中文字符的文件路径时遇到的问题及其解决方法。主要关注了如何在不同操作系统环境下正确处理中文路径,并提供了三种解决方案以确保文件操作的兼容性和稳定性。

问题:使用ifstream 或者ofstream 打开包含中文的路径失败。

解决方案:

 

方法1

 

 

 

方法2

   

 

方法3

 

 

locale 对象的name 方法可以看到,通过locale("") 构造出的locale 对象的name"Chinese_People's Republic of China.936" ,而原始的locale 对象的name"C" ,也就是缺省的ANSI _C 公约。

注意:如果使用locale loc = locale::global(locale("")) 设置全局locale 后没有用 locale::global(loc) 恢复的话,那么在程序后面的cout 语句就不能输出中文了,虽然这时候操作中文文件没有问题,但是这也是很容易让 人掉入陷阱的地方,应该值得注意。

49725@DESKTOP-CB4LRLP /cygdrive/f/S $ g++ -mwindows screensaver_clock.cpp -o screensaver_ -lcomctl32 -lgdi32 -luser32 screensaver_clock.cpp: In function 'void LoadLearningTime()': screensaver_clock.cpp:36:32: error: no matching function for call to 'std::basic_ifstream<char>::basic_ifstream(const wchar_t*&)' std::ifstream file(LOG_FILE); ^ In file included from screensaver_clock.cpp:5: D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:554:7: note: candidate: 'std::basic_ifstream<_CharT, _Traits>::basic_ifstream(std::basic_ifstream<_CharT, _Traits>&&) [with _CharT = char; _Traits = std::char_traits<char>]' basic_ifstream(basic_ifstream&& __rhs) ^~~~~~~~~~~~~~ D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:554:7: note: no known conversion for argument 1 from 'const wchar_t*' to 'std::basic_ifstream<char>&&' D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:529:7: note: candidate: 'std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const string&, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::__cxx11::string = std::__cxx11::basic_string<char>; std::ios_base::openmode = std::_Ios_Openmode]' basic_ifstream(const std::string& __s, ^~~~~~~~~~~~~~ D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:529:7: note: no known conversion for argument 1 from 'const wchar_t*' to 'const string&' {aka 'const std::__cxx11::basic_string<char>&'} D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:513:7: note: candidate: 'std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::ios_base::openmode = std::_Ios_Openmode]' basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in) ^~~~~~~~~~~~~~ D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:513:7: note: no known conversion for argument 1 from 'const wchar_t*' to 'const char*' D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:502:7: note: candidate: 'std::basic_ifstream<_CharT, _Traits>::basic_ifstream() [with _CharT = char; _Traits = std::char_traits<char>]' basic_ifstream() : __istream_type(), _M_filebuf() ^~~~~~~~~~~~~~ D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:502:7: note: candidate expects 0 arguments, 1 provided screensaver_clock.cpp: In function 'void SaveLearningTime()': screensaver_clock.cpp:53:32: error: no matching function for call to 'std::basic_ofstream<char>::basic_ofstream(const wchar_t*&)' std::ofstream file(LOG_FILE); ^ In file included from screensaver_clock.cpp:5: D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:780:7: note: candidate: 'std::basic_ofstream<_CharT, _Traits>::basic_ofstream(std::basic_ofstream<_CharT, _Traits>&&) [with _CharT = char; _Traits = std::char_traits<char>]' basic_ofstream(basic_ofstream&& _优化代码,全代码输出
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值