std :: length_error:basic_string将wstring转换为字符串

时间:2019-01-07 16:39:19

标签: c++ linux

我有一个任务来转换在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;
}

1 个答案:

答案 0 :(得分:1)

您不应依赖于平台。请使用C ++ 17样式,并使用std::filesystem::path作为路径名,并使用std::filesystem::exists检查文件是否存在。 std::filesystem::path可以处理char*wchar_t*