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

52编码器

我有一项任务是将用 Windows 编写的工具转换为在 Linux 中运行,因此我必须编写一个函数将字符串转换为wstringwstring在 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将uint16_t转换为宽字符串(std :: wstring)

来自分类Dev

错误:无法将std :: vector <std :: basic_string <char>>转换为std :: string *

来自分类Dev

将std :: wstring转换为int

来自分类Dev

C ++:将C字符串转换为std:string

来自分类Dev

将std :: basic_string分配给字符串

来自分类Dev

在抛出'std :: length_error'what()实例之后调用终止终止what():basic_string :: __ S_create

来自分类Dev

C ++无法将字符串转换为wstring

来自分类Dev

错误:无法将参数'1'的'std :: basic_string <char> :: iterator ...'转换为'const char * ...'

来自分类Dev

C ++错误:无法将'std :: basic_string <char>'转换为'const char *'

来自分类Dev

错误:分配中无法将“ std :: basic_string <char>”转换为“ char”

来自分类Dev

C ++错误:无法将'std :: basic_string <char>'转换为'const char *'

来自分类Dev

如何将std :: vector <uint8_t>转换为std :: basic_string <std ::: byte>以用于pqxx

来自分类Dev

错误:将“常量字符串{aka const std :: __ cxx11 :: basic_string <char>}”作为“ this”参数传递

来自分类Dev

错误:初始化时无法将'std :: string {aka std :: basic_string <char>}'转换为'char *'

来自分类Dev

无法将参数'2'的'std :: string {aka std :: basic_string <char>}'转换为'char *'到'int Save(int,char *)'

来自分类Dev

错误:初始化时无法将'std :: string {aka std :: basic_string <char>}'转换为'char *'

来自分类Dev

错误无法将赋值中的'std :: string {aka std :: basic_string <char>}'转换为'char'-C ++

来自分类Dev

将String ^转换为wstring C ++

来自分类Dev

当将std :: string转换为std :: wstring时,C ++ 17编解码器抛出“错误转换”

来自分类Dev

如何将std :: wstring转换为char const []

来自分类Dev

将std :: wstring转换为const wchar_t x []

来自分类Dev

C ++中的文件IO错误。引发'std :: length_error'what()实例后调用终止终止what():basic_string :: resize

来自分类Dev

错误:无法从'std :: string * {aka std :: basic_string <char> *}'转换为'std :: string {aka std :: basic_string <char>}'||

来自分类Dev

尝试从类数组输出字符串时出现std :: length_error

来自分类Dev

将unicode(带有BOM)字符串转换为ASCII std :: string

来自分类Dev

如何将std :: string转换为不同的字符串类?

来自分类Dev

如何将句柄字符串转换为std :: string

来自分类Dev

字符串自动将const char *转换为std :: string

来自分类Dev

无法将参数'1'的'std :: basic_string <char>'转换为'const char *'到'int system(const char *)'

Related 相关文章

  1. 1

    如何将uint16_t转换为宽字符串(std :: wstring)

  2. 2

    错误:无法将std :: vector <std :: basic_string <char>>转换为std :: string *

  3. 3

    将std :: wstring转换为int

  4. 4

    C ++:将C字符串转换为std:string

  5. 5

    将std :: basic_string分配给字符串

  6. 6

    在抛出'std :: length_error'what()实例之后调用终止终止what():basic_string :: __ S_create

  7. 7

    C ++无法将字符串转换为wstring

  8. 8

    错误:无法将参数'1'的'std :: basic_string <char> :: iterator ...'转换为'const char * ...'

  9. 9

    C ++错误:无法将'std :: basic_string <char>'转换为'const char *'

  10. 10

    错误:分配中无法将“ std :: basic_string <char>”转换为“ char”

  11. 11

    C ++错误:无法将'std :: basic_string <char>'转换为'const char *'

  12. 12

    如何将std :: vector <uint8_t>转换为std :: basic_string <std ::: byte>以用于pqxx

  13. 13

    错误:将“常量字符串{aka const std :: __ cxx11 :: basic_string <char>}”作为“ this”参数传递

  14. 14

    错误:初始化时无法将'std :: string {aka std :: basic_string <char>}'转换为'char *'

  15. 15

    无法将参数'2'的'std :: string {aka std :: basic_string <char>}'转换为'char *'到'int Save(int,char *)'

  16. 16

    错误:初始化时无法将'std :: string {aka std :: basic_string <char>}'转换为'char *'

  17. 17

    错误无法将赋值中的'std :: string {aka std :: basic_string <char>}'转换为'char'-C ++

  18. 18

    将String ^转换为wstring C ++

  19. 19

    当将std :: string转换为std :: wstring时,C ++ 17编解码器抛出“错误转换”

  20. 20

    如何将std :: wstring转换为char const []

  21. 21

    将std :: wstring转换为const wchar_t x []

  22. 22

    C ++中的文件IO错误。引发'std :: length_error'what()实例后调用终止终止what():basic_string :: resize

  23. 23

    错误:无法从'std :: string * {aka std :: basic_string <char> *}'转换为'std :: string {aka std :: basic_string <char>}'||

  24. 24

    尝试从类数组输出字符串时出现std :: length_error

  25. 25

    将unicode(带有BOM)字符串转换为ASCII std :: string

  26. 26

    如何将std :: string转换为不同的字符串类?

  27. 27

    如何将句柄字符串转换为std :: string

  28. 28

    字符串自动将const char *转换为std :: string

  29. 29

    无法将参数'1'的'std :: basic_string <char>'转换为'const char *'到'int system(const char *)'

热门标签

归档