2013-11-04 4 views
0

파일을로드하려고하는데 이전에 하드 코드 된 파일 위치 (예 : "c : \ location \ file.txt")를 사용했지만 몇 명의 친구도 파일, 나는 그들이 어디서나 실행 파일을 넣을 수 있도록하고 싶습니다. 나는 그들이 원하는 폴더를 사용자가에 자신의 실행를 추가 할 수 있도록 변경하기 위해 노력하고있어, 다음 그들은 폴더를 생성하고 설정이 그것으로 파일을 넣어현재 디렉토리의 파일 열기

ifstream myfile; 
myfile.open("c:\\client\\settings.cfg"); 

: 같은

내 현재 코드 보인다 exe는 해당 설정을로드합니다.

ifstream myfile; 
myfile.open("\\settings\\settings.cfg"); 

나는 장소에 몇 가지 기본적인 오류 처리 및 지금 파일을 찾을 수 없다는 항상 프로그램 오류가 밖으로있다.

파일 구조는 다음과 같습니다

[ART] 
    asset.png 
[SETTINGS] 
    settings.cfg 
client.exe 

이 할 수있는 정말 간단한 일처럼 보인다,하지만 난 그것을 할 수있는 방법을 찾을 수 없습니다. 파일 읽기 및 쓰기에 대한 모든 예제 및 자습서는 실행 파일의 디렉토리에있는 파일 만 처리하거나 c : \ 폴더에 하드 코드화됩니다.

아무도 내가이 작업을 수행하는 방법을 알려줄 수 있습니까?

답변

4

대부분의 시스템에 대한 검색 경로는 현재 작업 디렉토리에서 시작하여 PATH 환경 변수로 시작됩니다.

ifstream myfile; 
myfile.open("settings\\settings.cfg"); 
//   ^^ Note the lack of \\ to start the file path 
+0

이 작품! 감사! – user2827019

+2

@ user2827019 필자의 대답에서 언급했듯이 이것은 실행 파일의 디렉토리와 관련이 없습니다. 그것은 단지 사용자의 현재 디렉토리와 관련이 있습니다. 사용자가 해당 디렉토리에서 실행 파일을 시작하면 실행 파일의 디렉토리와 일치합니다. –

+0

@ user2827019 : 문제 없습니다. 한 가지주의 할 점은 실행 디렉토리가 아닌 * working directory *를 기반으로한다는 것입니다. 따라서 바로 가기를 만들고 작업 디렉토리 (Windows 바로 가기의 "시작 위치"폴더)를 변경하면 해당 폴더가 보입니다. –

2

\로 시작하는 경로는 항상 현재 드라이브의 루트 디렉토리에 상대적인 : 그래서, 당신이 오직 할 필요가있는 절대 경로 표시하지 않고 파일/폴더를 지정하고 작업 디렉토리에 상대적인 경로를 사용하는 것이다 . 현재 드라이브가 C:이면 \settings\settings.cfgC:\settings\settings.cfg을 의미합니다.

모든 것을 피하지 않으려면 /을 사용할 수 있습니다. 따라서 사용할 수 있습니다 : settings/settings.cfg. 이것은 사용자의 현재 디렉토리에 상대적입니다. 그러나 이것은 반드시 실행 파일이 상주하는 디렉토리와 일치하지는 않습니다. 당신이로 시작하는 경로를 생성, 실행 파일의 디렉토리에 settings/settings.cfg 상대를 열려면

#include <Windows.h> 
// ... 

HMODULE module = GetModuleHandleW(NULL); 
WCHAR path[MAX_PATH]; 
GetModuleFileNameW(module, path, MAX_PATH); 

을 지금 : 당신이 실행 파일의 디렉토리를 필요로하는 경우에, 당신은 그것을 얻기 위해 Windows API 함수를 사용해야합니다 path/settings/settings.cfg을 추가하십시오.

+0

이렇게 할 방법이 없습니까? 항상 모든 위치의 정확한 위치를 지정해야합니까? 코드를'\ settings \ settings.cfg'으로 변경하면 c : \ game 또는 c : \ client에 "설치"되어 있어도 C : /settings/settings.cfg 파일을 항상 읽고 쓰려고합니다. – user2827019

+0

@ user2827019 코드에 표시된대로 GetModuleFileNameW() 함수를 사용하십시오. –

관련 문제