问题是如何将wstring转换为字符串?
我有下一个例子:
#include <string>
#include <iostream>
int main()
{
std::wstring ws = L"Hello";
std::string s( ws.begin(), ws.end() );
//std::cout <<"std::string = "<<s<<std::endl;
std::wcout<<"std::wstring = "<<ws<<std::endl;
std::cout <<"std::string = "<<s<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
注释掉的输出是:
std::string = Hello
std::wstring = Hello
std::string = Hello
Run Code Online (Sandbox Code Playgroud)
但不仅仅是:
std::wstring = Hello
Run Code Online (Sandbox Code Playgroud)
这个例子有什么不对吗?我可以像上面那样进行转换吗?
编辑
新的例子(考虑到一些答案)是
#include <string>
#include <iostream>
#include <sstream>
#include <locale>
int main()
{
setlocale(LC_CTYPE, "");
const std::wstring ws = L"Hello";
const std::string s( ws.begin(), ws.end() );
std::cout<<"std::string = "<<s<<std::endl;
std::wcout<<"std::wstring = "<<ws<<std::endl;
std::stringstream ss;
ss …Run Code Online (Sandbox Code Playgroud) 在我看来Linux使用/ proc/self/exe很容易.但我想知道是否有一种方便的方法可以在C/C++中使用跨平台接口查找当前应用程序的目录.我已经看到一些项目与argv [0]混在一起,但它似乎并不完全可靠.
如果你曾经不得不支持Mac OS X,它没有/ proc /,你会做什么?使用#ifdefs隔离特定于平台的代码(例如NSBundle)?或者尝试从argv [0],$ PATH等等推断出可执行文件的路径,冒着在边缘情况下发现错误的风险?
在C/C++中是否有办法找到当前执行程序的位置(完整路径)?
(问题argv[0]在于它没有给出完整的路径.)
我需要fstream在Windows上使用我的C++应用程序访问某些文件.这些文件都位于我的exe文件所在文件夹的子文件夹中.
我想获得当前流程的完整路径.
我_getcwd用来获取当前的工作目录.但它不包括文件名.
我怎样才能获得如下文件名:filename.exe?
在我被标记为重复之前,我能找到的所有类似问题在引入 std::filesystem 之前都有答案,并且使用特定于平台的代码或 Boost::filesystem。我正在寻找一个使用 std::filesystem 的便携式答案。
是否可以使用 std::filesystem 获取 C++ 可执行文件所在的路径(而不是工作目录)?如果是的话,怎么样?
可能重复:
获取可执行文件的路径
我正在使用MinGW,gcc 4.4.3在Windows上编程.当我使用这样的main函数时:
int main(int argc, char* argv[]){
cout << "path is " << argv[0] << endl;
}
Run Code Online (Sandbox Code Playgroud)
在Windows上,我得到一个完整的路径:"C:/ dev/stuff/bin/Test".但是,当我在Linux上运行相同的应用程序时,我会得到某种相对路径:"bin/Test".这打破了我的申请!关于如何确保路径在两个系统上都是绝对的任何想法?
我在另一个论坛上找到了这个,应该可以给你。但我认为这可能不是最好的方法,而且我认为它会由于数组未被删除而导致内存泄漏。这是真的?
这也是最好的方法吗?最好的方法是直接提供文件夹目录的跨平台命令(如果不存在则使用 Windows)。
std::string ExePath()
{
using namespace std;
char buffer[MAX_PATH];
GetModuleFileName(NULL, buffer, MAX_PATH);
string::size_type pos = string(buffer).find_last_of("\\/");
if (pos == string::npos)
{
return "";
}
else
{
return string(buffer).substr(0, pos);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在为OpenGL构建一个非常轻量级的库/包装器,我遇到了一个小问题.假设我有一个看起来像这样的目录结构:
GraphicsProject
|GraphicsApp
||main.cpp
|GraphicsLib
||include
|||fileA.h
|||fileB.h
||library
|||fileA.cpp
|||fileB.cpp
||shaders
|||shader1.txt
|||shader2.txt
|| build
||| bunch of build stuff
Run Code Online (Sandbox Code Playgroud)
在运行时获取shader1.txt路径的最佳方法是什么?或者,不管是谁在使用这个项目或者它在用户机器上的位置,都要使路径不会改变?
我考虑过的一些选项:1)获取当前的工作目录并使用该路径直到我需要的位置.我对此解决方案的主要关注是,我不确定当前目录将根据用户构建项目的方式或其他因素而无法控制.它也感觉不是很优雅.2)将着色器的源代码存储为char数组/字符串,位于include目录中的.h文件中.这似乎是一个更好的解决方案,除了它会使着色器编写稍微麻烦.
有这样做的标准方法吗?我正在使用CMake构建项目,如果这改变了什么.
我正在尝试从不同的流程启动流程.实现这一目标的机制不会发生变化.发射器和原始过程都位于C:\dir.
我正在从cmd文件中启动我的启动器.该cmd文件本身位于其他地方,为了为它找到了启动程序可执行文件,我设置的PATH变量:
set PATH=C:\dir;%PATH%;
launcher.exe
Run Code Online (Sandbox Code Playgroud)
启动程序使用以下代码启动子进程:
STARTUPINFO startupInfo;
startupInfo.cb = sizeof (STARTUPINFO);
startupInfo.lpReserved = 0;
startupInfo.lpDesktop = NULL;
startupInfo.lpTitle = NULL;
startupInfo.dwX = 0;
startupInfo.dwY = 0;
startupInfo.dwXSize = 0;
startupInfo.dwYSize = 0;
startupInfo.dwXCountChars = 0;
startupInfo.dwYCountChars = 0;
startupInfo.dwFillAttribute = 0;
startupInfo.dwFlags = _showInForeground ? STARTF_USESHOWWINDOW : 0;
startupInfo.wShowWindow = _showInForeground ? 1 : 0;
startupInfo.cbReserved2 = 0;
startupInfo.lpReserved2 = 0;
PROCESS_INFORMATION processInfo;
BOOL retVal = CreateProcess("child.exe", "", NULL, NULL, FALSE, …Run Code Online (Sandbox Code Playgroud) 我正在用 C++ 创建一个游戏引擎,并且我已经开始添加对加载文件的支持。我创建了一个如下所示的加载文件方法:
#include <string>
#include <fstream>
std::string read_file(const char* filepath) {
FILE* file = fopen(filepath, "rt");
if(file != NULL) {
fseek(file, 0, SEEK_END);
} else {
std::string error_message = std::string("[ERROR]: Failed to load file ");
error_message.append(filepath);
return error_message;
}
unsigned long length = ftell(file);
char* data = new char[length + 1];
memset(data, 0, length + 1);
fseek(file, 0, SEEK_SET);
fread(data, 1, length, file);
fclose(file);
std::string result(data);
delete[] data;
return result;
}
Run Code Online (Sandbox Code Playgroud)
为了测试这个功能,我决定尝试加载一个“test.txt”文件,但除非我包含完整路径,否则这将不起作用,例如
"/Users/(Username)/.../(Executable Directory)/text.txt"
Run Code Online (Sandbox Code Playgroud)
而不仅仅是
"test.txt"
Run Code Online (Sandbox Code Playgroud)
所以,为了解决这个问题,我需要一种方法来获取可执行文件所在目录的完整路径,然后将文件名附加到路径的末尾,并在我的加载文件方法中加载它。
有谁知道怎么获取路径?
假设我有一个名为MyDll.dll的dll
它位于d:\ MyWorks\MyDll.dll [它是directshow dll]
我想从MyDll代码中获取其位置的路径.
我使用了boost: FileSystem
string path = "";
boost::filesystem::path full_path( boost::filesystem::current_path() );
path = full_path.string();
Run Code Online (Sandbox Code Playgroud)
但这给了我它的执行路径,即C:\ Windows\system32,而不是它的位置路径,即d:\ MyWorks\MyDll.dll.
如何在同一个dll中获取dll的位置?
更新:通过获取模块:
TCHAR path[2048];
GetModuleFileName( NULL, path, 2048 );
ostringstream file;
file << path ;
string const pathString =file.str();
cout << "Path: " << pathString << endl;
Run Code Online (Sandbox Code Playgroud)
给我一个十六进制的字符串:0049EA95 ....
我有一个用Windows 7上的MinGW编译的C++程序调用fopen(),指定一个具有相对路径的文件.如果你在它自己的目录中运行可执行文件,该程序工作正常,但我注意到如果我在不同的目录中使用命令行运行程序,fopen()将找不到指定的文件.例如,如果我的可执行文件"foo.exe"和指定文件"bar.txt"位于"C:\ project\build \"中,并且我在"C:\ project \"中运行exe,则fopen()将找不到文件.使用代码或编译器标志是否有一些解决方法?