C++;,对路径使用环境变量 < > C++中有没有使用环境变量来实现文件路径的方法? 这个想法是在不花费任何费用的情况下使用它们,所以当我想要保存/读取文件时,对于使用unicode标准的语言,我不需要使用wchar
//编辑 少加修改,多加解释 所以我试图实现的是读/写文件,而不用担心路径中的字符。所以我不想使用C++;,对路径使用环境变量 < > C++中有没有使用环境变量来实现文件路径的方法? 这个想法是在不花费任何费用的情况下使用它们,所以当我想要保存/读取文件时,对于使用unicode标准的语言,我不需要使用wchar,c++,file,unicode,io,C++,File,Unicode,Io,//编辑 少加修改,多加解释 所以我试图实现的是读/写文件,而不用担心路径中的字符。所以我不想使用wchar作为路径,但如果路径包含一些宽字符,它应该可以工作 有函数getenv和GetEnvironmentVariable,但它们需要在windows设置中为非Unicode程序设置合适的语言(控制面板->时钟、语言和区域->区域和语言->管理)这需要用户执行一些操作,这是我尽量避免的。标准库提供了函数getenv。以下是一个例子: #include <cstdlib> int m
wchar
作为路径,但如果路径包含一些宽字符,它应该可以工作
有函数
getenv
和GetEnvironmentVariable
,但它们需要在windows设置中为非Unicode程序设置合适的语言(控制面板
->时钟、语言和区域
->区域和语言
->管理
)这需要用户执行一些操作,这是我尽量避免的。标准库提供了函数getenv。以下是一个例子:
#include <cstdlib>
int main()
{
char* pPath;
pPath = getenv("PATH");
if (pPath)
std::cout << "Path =" << pPath << std::endl;
return 0;
}
#包括
int main()
{
char*pPath;
pPath=getenv(“路径”);
if(pPath)
标准::cout
有函数getenv和GetEnvironmentVariable,但它们需要为windows设置中的非Unicode程序设置适当的语言
这是一个Windows问题
在Linux等其他平台上,文件路径和环境变量本机是基于字节的;您可以使用标准C库函数访问它们,这些函数采用字节字符串路径,如fopen()
和getenv()
。路径名可以向用户表示Unicode字符串(使用某种编码进行解码,几乎总是UTF-8,它可以对任何字符进行编码),但对于代码来说,它们只是字节字符串
另一方面,Windows的文件名和环境变量本机是16位(UTF-16)代码单元的字符串(这与Unicode字符代码点几乎相同,但不完全相同,因为这太容易了……但另一方面这让人很难过)。您可以调用Win32文件处理API,如CreateFileW()
和getEnvironmentVariaBlow()
使用UTF-16代码单元字符串(wchar\u t
,在Windows上编译时)并直接访问任何文件名
还有一些老式的基于字节的Win32函数,如GetEnvironmentVariableA()
(如果您正在编译非Unicode项目,这就是GetEnvironmentVariable()
所指向的)。如果调用这些函数,Windows必须使用某种编码将您提供的char
字节字符串转换为UTF-16字符串。
该编码是特定于“ANSI”(“A”)语言环境的默认代码页,即“非Unicode程序的语言”设置的代码页
虽然该编码可以由用户更改,但不能设置为UTF-8或任何其他支持所有字符的编码,因此即使您要求用户更改该编码,也无法访问所有文件。因此,始终避免使用Win32A
API
当您希望以同时在Windows和其他平台上工作的方式访问文件时,就会出现问题。如果您使用字节字符串调用C标准库,Microsoft C运行时库会调整这些调用,以调用基于Win32a
字节的API,如上所述,这些API非常有限
因此,你不吸引人的选择是:
在代码中使用wchar\u t
和std::wstring
字符串,仅使用Win32 API与文件名和环境变量交互,并接受您的代码永远不会在其他平台上运行,或者
使用char
和UTF-8编码的std::string
字符串,并放弃在Windows上使用非ASCII字符访问文件名和环境变量的代码,或
编写大量分支#ifdef
代码,以便在使用C标准函数进行文件名和环境交互之间切换,或者使用Win32 API进行一系列UTF-8-char
-to-wchar\t
字符串转换,以便代码可以跨多个平台工作,或者
使用为您封装(3)的库
这并不完全是微软的错:Windows NT是在UTF-8或astral planes发明之前的Unicode早期设计的,当时人们认为16位代码单元字符串是一种完全合理的文本存储方式,并不像我们现在知道的那样是一场可悲的灾难。然而,令人遗憾的是,Windows没有被更新从那时起,我开始将UTF-8视为一等公民,并提供一种编写跨平台应用程序的简便方法。请仔细阅读我的帖子,然后再给我一个负号。不要扩展变量。据我所知,getenv
将环境变量转换为完整路径。如果设置了环境变量,它将采用该值。如果获取变量,您就得到了该值。在获取过程中没有进行任何扩展,尽管如果使用类似于export foo=~/bar
的方法,您的扩展将在setting@Derag这不是一个有效路径-它必须展开。在Windows上,您可以使用这些函数获取“特殊文件夹”.你能准确地更新你的问题吗?你希望阅读什么,你期望的输出是什么,你尝试了什么;因为我认为所有参与的人现在都感到困惑了?