Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;,对路径使用环境变量 < > C++中有没有使用环境变量来实现文件路径的方法? 这个想法是在不花费任何费用的情况下使用它们,所以当我想要保存/读取文件时,对于使用unicode标准的语言,我不需要使用wchar_C++_File_Unicode_Io - Fatal编程技术网

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或任何其他支持所有字符的编码,因此即使您要求用户更改该编码,也无法访问所有文件。因此,始终避免使用Win32
A
API

当您希望以同时在Windows和其他平台上工作的方式访问文件时,就会出现问题。如果您使用字节字符串调用C标准库,Microsoft C运行时库会调整这些调用,以调用基于Win32
a
字节的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上,您可以使用这些函数获取“特殊文件夹”.你能准确地更新你的问题吗?你希望阅读什么,你期望的输出是什么,你尝试了什么;因为我认为所有参与的人现在都感到困惑了?