我有一项任务是将用 Windows 编写的工具转换为在 Linux 中运行,因此我必须编写一个函数将字符串转换为wstring
或wstring
在 Linux 中转换为字符串。
由于我对c++不熟悉,当我调用Linux API时,我必须更改string
为下面的char*
like函数IsFileExist
。
如果我删除 function setlocale
,错误消息如下:
libc++abi.dylib: terminating with uncaught exception of type std::length_error: basic_string
问题:这是否正确使用setlocale
?实际上在谷歌之后仍然对此感到困惑。
这是代码:
#include <iostream>
#include <vector>
#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <fstream>
/*
string converts to wstring
*/
std::wstring s2ws(const std::string& src)
{
std::wstring res = L"";
size_t const wcs_len = mbstowcs(NULL, src.c_str(), 0);
std::vector<wchar_t> buffer(wcs_len + 1);
mbstowcs(&buffer[0], src.c_str(), src.size());
res.assign(buffer.begin(), buffer.end() - 1);
return res;
}
/*
wstring converts to string
*/
std::string ws2s(std::wstring const & src)
{
setlocale(LC_CTYPE, "");
std::string res = "";
size_t const mbs_len = wcstombs(NULL, src.c_str(), 0);
std::vector<char> buffer(mbs_len + 1);
wcstombs(&buffer[0], src.c_str(), buffer.size());
res.assign(buffer.begin(), buffer.end() - 1);
return res;
}
int IsFileExist(const std::wstring& name ) {
struct stat buffer;
/*convert wstring to string,then to C style char* */
std::string str = ws2s(name.c_str());
char *cstr = new char[str.length() + 1];
strncpy(cstr, str.c_str(),str.size());
/*judge if file exist*/
if(0 == stat(cstr,&buffer))
{
delete [] cstr;
return 1;
}
else
{
delete [] cstr;
return 0;
}
}
int main()
{
std::wstring str=L"chines中文œ∑®";
std::string res = ws2s(str);
std::cout<<res<<std::endl;
char dst[]="abcdef";
std::wstring fun = s2ws(dst);
std::wcout<<fun<<std::endl;
std::wstring file=L"/Users/coder52/Downloads/mac.zip";
std::cout << IsFileExist(file) << std::endl;
return 0;
}
你不应该依赖于平台。请将其设为 C++17 样式并用作std::filesystem::path
路径名并使用std::filesystem::exists
. std::filesystem::path
能够同时处理char*
和wchar_t*
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句