現在実行中のものを取得する方法exeが存在するパスの二重斜線形式?---GetModuleFileNameの使用

2297 ワード

まず簡単なプログラムを見てみましょう.
#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
	char  szBuf[1025] = {0};   
	GetModuleFileName(NULL, szBuf, sizeof(szBuf));
	cout << szBuf << endl; // C:\Documents and Settings\Administrator\  \cpp\test\Debug\test.exe

	return 0;
}

しかし、プログラムで上記の力を利用すれば、だめです.C言語ではエスケープ文字なので、次のように見てみましょう.
#include <fstream>
using namespace std;

int main()
{
	ofstream outFile("C:\Documents and Settings\Administrator\  \MYCPP\test.txt"); //     test.txt  
	outFile << "hello world" << endl;

	return 0;
}

次のプログラムはokです.
#include <fstream>
using namespace std;

int main()
{
	ofstream outFile("C:\\Documents and Settings\\Administrator\\  \\MYCPP\test.txt"); //    test.txt  
	outFile << "hello world" << endl;

	return 0;
}

引き続き見てみましょう
#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
	char  szBuf[1025] = {0};   
	GetModuleFileName(NULL, szBuf, sizeof(szBuf));
	cout << szBuf << endl; //   C:\Documents and Settings\Administrator\  \cpp\test\Debug\test.exe

	if(0 == strcmp(szBuf, "C:\\Documents and Settings\\Administrator\\  \\cpp\\test\\Debug\\test.exe"))
	{
		cout << "yes" << endl; //   yes
	}
	else
	{
		cout << "no" << endl;
	}

	return 0;
}

不思議に思わないでください.はエスケープ記号で、\は1つのを表します.だから、次のコードは間違っています.
int main()
{
	char c = '\'; // error
	return 0;
}

上記の議論に基づいて、本題に戻り、現在のパスのコードを取得します.
 
#include <windows.h>
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
	char   szBuf[1025] = {0};   
	GetModuleFileName(NULL, szBuf, sizeof(szBuf));
	
	char *p = strrchr(szBuf, '\\'); 
	*p = '\0'; 

	strcat(szBuf, "\\test.txt");  //     , strcat     

	cout << szBuf << endl; //        ,           

	ofstream outFile(szBuf); //    test.txt  
    outFile << "hello world" << endl;

	return 0;
}

要するに、エスケープ記号を理解して、すべてが簡単です.