我有一个任务来转换在Windows中编写的工具以在Linux中运行,因此我必须编写一个将字符串转换为wstring
或在Linux中将wstring
转换为字符串的函数。
由于我不熟悉c ++,因此当我调用Linux API时,必须像下面的函数string
一样将char*
更改为IsFileExist
。
如果我删除功能setlocale
,则会出现以下错误消息:
libc++abi.dylib: terminating with uncaught exception of type std::length_error: basic_string
问题 :使用setlocale
是否正确?实际上,在Google对此仍然感到困惑之后。
代码如下:
#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;
}
答案 0 :(得分:1)
您不应依赖于平台。请使用C ++ 17样式,并使用std::filesystem::path
作为路径名,并使用std::filesystem::exists
检查文件是否存在。 std::filesystem::path
可以处理char*
和wchar_t*
。