2016-10-28 4 views
-4

경로를 파일로 C++에서 환경 변수를 사용하는 방법은 무엇입니까? 아이디어를 사용하지 않고 사용할 수 있으므로 파일을 저장/읽을 때 유니 코드 표준 언어로 wchar을 사용할 필요가 없습니다.C++, 경로에 환경 변수 사용

// 편집

더 많은 설명이 포함 된 적은 편집.

그래서 내가 시도하는 것은 경로의 문자를 걱정하지 않고 파일을 읽고 쓰는 것입니다. 따라서 경로로 wchar을 사용하고 싶지는 않지만 경로에 넓은 문자가 포함되어 있으면 작동해야합니다.

함수 getenvGetEnvironmentVariable있다 그러나 그들은 창 설정에서 Language for non-Unicode programs에 적절한 언어를 설정해야합니다 (Constrol Panel ->Clock, Language, and Region ->Region and Language ->Administrative) 사용자의 일부 작업이 필요하고 이것이 내가 피하려고 무언가이다.

+0

http://en.cppreference.com/w/cpp/utility/program/getenv – UKMonkey

+0

마이너스를주기 전에 내 게시물을 자세히 읽어보십시오. 변수를 확장하지 않고. 내가 아는 한'getenv'는 환경 변수를 전체 경로로 변환합니다. – Derag

+0

환경 변수를 설정하면 그 값을 사용합니다. 변수를 얻으면 그 값을 얻습니다. 'export foo = ~/bar'와 같은 것을 사용하면 설정시에 확장이 수행됩니다. – UKMonkey

답변

1

이 기능은 GETENV하고 GetEnvironmentVariable하지만 윈도우에서 유니 코드를 지원하지 않는 프로그램 용 언어에 적절한 언어를 설정해야이 특별히 윈도우 문제

설정 : 다음은 예입니다.

Linux와 같은 다른 플랫폼에서 파일 경로 및 환경 변수는 기본적으로 바이트 기반입니다. 당신은 fopen()getenv()과 같은 바이트 - 스트링 경로를 취하는 표준 C 라이브러리 함수를 사용하여 그것들에 접근 할 수있다. 경로 이름은 사용자에게 유니 코드 문자열을 나타낼 수 있지만 (거의 모든 문자를 인코딩 할 수있는 UTF-8과 같은 인코딩을 사용하여 디코딩 됨) 코드는 바이트 문자열 일뿐입니다.

Windows는 기본적으로 16 비트 (UTF-16) 코드 단위의 문자열 인 파일 이름과 환경 변수를 가지고 있습니다 (유니 코드 문자 코드 포인트와 거의 동일하지만 아주 너무 쉬울 것입니다 ...하지만 그것은 다른 시간 동안 슬픔입니다). CreateFileW()GetEnvironmentVariableW()과 같은 Win32 파일 처리 API를 UTF-16 코드 단위 문자열 (Windows에서 컴파일 할 때 wchar_t)을 사용하여 호출하고 파일 이름에 직접 액세스 할 수 있습니다.

GetEnvironmentVariableA()과 같은 오래된 학교 레거시 바이트 기반 Win32 함수도 있습니다 (유니 코드가 아닌 프로젝트를 컴파일하는 경우 GetEnvironmentVariable()을 가리킴). 이러한 함수를 호출하면 Windows에서 char 바이트 문자열을 UTF-16 문자열로 변환해야합니다. 인코딩은 '유니 코드가 아닌 프로그램 용 언어'가 설정하는 'ANSI'('A') 로캘 별 기본 코드 페이지입니다.

인코딩은 사용자가 변경할 수 있지만 UTF-8 또는 모든 문자를 지원하는 다른 인코딩으로 설정할 수 없으므로 사용자에게 변경을 요청하더라도 여전히 변경할 수 없습니다. 모든 파일에 액세스 할 수 있습니다. 따라서 Win32 A API는 항상 피해야합니다.

Windows와 다른 플랫폼 모두에서 작동하는 방식으로 파일에 액세스하려는 경우 문제가 발생합니다.바이트 문자열을 사용하여 C 표준 라이브러리를 호출하면 Microsoft C 런타임 라이브러리가 Win32 A 바이트 기반 API를 호출하도록 해당 호출을 조정합니다. 위의 설명은 위와 같이 자극적으로 제한됩니다. 파일 이름과 환경 변수와 상호 작용하고, 코드가 다른 플랫폼에서 실행되지 않습니다 것을 받아들이 만의 Win32 API를 사용하여 코드에

  1. 사용 wchar_tstd::wstring 문자열, 또는 :

    그래서 매력의 선택은 ;

  2. char 및 UTF-8 인코딩 std::string 문자열을 사용하고 Windows에서 비 ASCII 문자로 된 파일 이름 및 환경 변수에 액세스하는 코드를 포기하거나.
  3. 파일 이름과 환경 상호 작용을 위해 C 표준 함수를 사용하거나 UTF-8- char -사이의 문자열 변환을 사용하여 Win32 API를 사용하여 코드가 작동하도록 분기하는로드를 분기 코드 #ifdef에 작성합니다. 여러 플랫폼 또는
  4. (3)을 캡슐화 한 라이브러리를 사용하십시오.

이것은 완전히 Microsoft의 잘못이 아닙니다. Windows NT는 UTF-8 또는 아스트랄 평면이 만들어지기 전에 유니 코드 초기에 설계되었으므로 16 비트 코드 단위 문자열이 완전히 합리적이라고 생각했습니다 우리가 지금 알고있는 것처럼, 비참한 재앙이 아니라 텍스트를 저장하는 방법. 그러나 UTF-8을 일류 시민으로 취급하고 크로스 플랫폼 응용 프로그램을 작성하는 쉬운 방법을 제공하기 위해 Windows가 업데이트되지 않은 것은 매우 슬픈 일입니다.

0

표준 라이브러리는 사용자에게 getenv 기능을 제공합니다.

#include <cstdlib> 

int main() 
{ 
    char* pPath; 
    pPath = getenv("PATH"); 
    if (pPath) 
     std::cout << "Path =" << pPath << std::endl; 
    return 0; 
}