jak uzyskać ścieżkę do katalogu w którym uruchamiany jest program

0

Siema, piszę program, który będzie korzystał z kilku plików, które będą się znajdowały w tym samym katalogu co mój program. Chodzi głównie o to,żebym np. mógł tę ścieżkę zapisać do jakiegoś stringa i potem użyć w funkcji system(), lub też bezpośrednio jakoś w funkcji system, przy czym będę zapisywał wynik uruchomienia na konsoli ( >> ) od pliku txt (dopiero pozniej program to bedzie analizowal itd itd) . Jak mogę sprawić żeby to było zawsze przenośne?(windows)
coś w stylu:

system("%WaszPatent%\mojpomocniczy.exe >> %WaszPatent%\plik.txt")

1

Ścieżka do programu znajduje się w argv[0]

Przy deklaracji:

int main(int argc, char *argv[])

Oczywiście.

0

super dzięki działa.
Jest tylko jeszcze jedno zapytanie: po drodze już musiałem zamienić \ na \ żeby ścieżka była poprawna i mi ten plik, z którego chcę korzystać czytało, ALE istnieje jeszcze taki problem,że ścieżkę akceptuje mi jedynie kiedy w niej nie ma żadnej spacji. Wiecie o co chodzi?

np. tworzę sobie string buffer, na odpowiednie sposoby zapisuję w nim przykładowo d:\pomocniczy.exe >> d:\plik.txt i następnie uruchamiam
system(buffer) - śmiga pięknie

Problem,gdy zmieszczę moją aplikację choćby w c:\program files\cośtam...
W ścieżce pojawia się po słowie program spacja, wyskakuje błąd, że "C:\Program" nie jest rozpoznawana jako polecenie wewnetrzne lub zew. itd itd.

Czy należy coś wstawić w miejsce spacji do stringa zawierającego ścieżkę jakis znaczek czy cos żeby czytało spacje?

0

Musisz na początku i końcu ścieżki dodać znak cytatu/cudzysłowie (" - \").
Btw, robisz obsługę plików za pomocą system?
Nie łatwiej będzie po prostu nauczyć się to robić normalnie?

0

thx.
Muszę to wykorzystać w tym przypadku dlatego, że choć program, którego odpalam za pomocą cmd jest systemowy, to mam ściągniętą jego angielską wersję i wrzucam go razem do paczki z moim programem żeby mogli z niego korzystać również zagraniczni użytkownicy. Program bowiem wykorzystuje dane o sektorze (już działając na plikach w sposób normalnu:D) pobrane z bcdedit.exe, pyta o klawisz jaki ma byc odpowiedzialny za uruchamianie go przy włączaniu komputera i generuje plik .bat, którego wystarczy potem odpalić aby zmiany zostały wprowadzone na stałe:) Taki program może byc bardzo przydatny np. gdy chcemy sobie wydzielic jakąś partycję, na której będziemy trzymać kopie zapasową elegancko zoptymalizowanego systemu i wrazie potrzeby można go postawić w mniej niż 10minut:) jak sami wiecie można go wykorzystać do wielu innych rzeczy. Później go gdzieś wam wrzucę!
dzięki serdeczne za pomoc

0

no, kochani - nie wiem czy do końca to o to chodziło, chyba, że to ja coś źle robię, ale co tu wielce źle do zrobienia jest to tez nie wiem. lets take a look:

http://i45.tinypic.com/200aeeb.jpg

ba, nie śmiga już nawet dla wersji ścieżki bez spacji, ale argumentuje też inaczej:p

http://oi49.tinypic.com/xmu2j9.jpg

da fuk?

0

Czemu dajesz podwójne znaki '' do ścieżki? Plik się nie otwiera, bo ma za dużo tych znaczków.

0

Dzięki MJay, o to chodziło.

Więc: albo z double backslashami ale bez cudzyslowow i wtedy sciezka bez spacji, ALBO i właściwie!:

w cudzyslowie BEZ double backshlasow. THX, do zamkniecia

0

Oczywiście, że nie. Mówiąc '' miałem na myśli w ścieżce wyświetlanej. Znak '' jest znakiem specialnym, dlatego aby wprowadzić do ścieżki należy napisać '\'. To daje nam pojedynczy znak '', ale to nie jest to o co mi chodziło. Po pierwsze w apostrofy pakujemy tylko jeden znak, '\\' to są już dwa znaki, a miałeś tam takie porównanie. Coś takiego mógłbyś wstawić między cudzysłowy. Ale nie o to nam chodzi. Ścieżka do programu w Windows wygląda tak "C:\Windows\Temp...", a nie "C:\Windows\Temp\..". Aby otrzymać prawidłowy wynik musimy jednak napisać w programie właśnie tak "C:\Windows\Temp\..", a nie tak "C:\\Windows\\Temp\\.." co Ty uczyniłeś w swoim programie.

0

czyli system() przetwarza nasze \ na \ ,zgadza sie?
Skoro więc, jak na załączonym screenie mam:
http://i46.tinypic.com/t6wmix.jpg to nadal nie rozpoznaje?

 
	string mypath = argv[0];
	mypath.erase(mypath.length() - 8 , mypath.length()-1);

	for (int i = 0; i < mypath.length(); ++i)
	if (mypath[i] == '\\')
	{	
	mypath.insert(i, 1, '\\\\');
	++i; 
	}
	 
	mypath = "\""+ mypath + "bcdedit.exe"+ "\"" + " >> " + "\"" + mypath + "plik.txt" + "\"" ;

	cout << mypath << "\n\n\n";

	system(mypath.c_str());

btw. nie powiem ze Twoj podpis mnie nie dobil

0

Jak widzisz, aby do programu wprowadzić znak " musisz użyć specialnego znaku ", podobnie jest ze znakiem ****, aby go wprowadzić musisz wpisać \ i z \n, \t itd. Zobacz, ze w moim programie ja nie zamieniam znaku \ na powójny znak \\, bo jak już wspomniałem wcześniej ścieżka w Windows wygląda tak C:\Window\Temp... a nie C:\Window\Temp\...

#include <iostream>
#include <string>
using namespace std;

int main( int argc, char** argv )
{
	string myPath = argv[ 0 ];

	cout << myPath;
	unsigned pos = myPath.find_last_of( '\\' );
	{
		string temp = myPath;
		myPath.assign( temp.begin( ), temp.begin( ) + pos + 1 );
	}

	cout << endl << myPath;
	getchar( );
	return 0;
}
0

No i w porządku, to rozumiem, ale żeby to jednocześnie użyć z " >> " zapisem do pliku, po wykonaniu wybranego pliku to da sie zrobić w jednej linii?

cmd.exe /c wykonuje i kończy,
może by trzeba jakos cmd.exe /k cd <tu nasza="nasza" sciezka="sciezka"> i nastepnie odpalic plik i dopiero zapisac do pliku?
Ale czy da sie polecenia oddzielać a wpisywać w jednym system()?

0

Oczywiście, że tak:

#include <iostream>
#include <string>
using namespace std;

int main( int argc, char** argv )
{
	string myPath = argv[ 0 ];

	cout << myPath;
	unsigned pos = myPath.find_last_of( '\\' );
	{
		string temp = myPath;
		myPath.assign( temp.begin( ), temp.begin( ) + pos + 1 );
	}

	cout << endl << myPath;
	myPath = "\"" + myPath + "nazwa_programu >> " + myPath + "nazwa_pliku\"";
	system( myPath.c_str( ) );
	getchar( );
	return 0;
}
0

rozwiązanie nadal działa tylko dla lokalizacji, które nie mają spacji:(

działa np dla: "D:\folder\bcdedit.exe >> D:\folder\tekstowy.txt"

nie działa np: "C:\Program Files\folder\bcdedit.exe >> C:\Program Files\folder\tekstowy.txt"

'C:\Program' nie jest rozpoznawana..itd

czego może brakować?

0

Nie mam pojęcia jak to zrobić po Windowsem. Pod linuksem jest to zwykłe wstawienie znaku \ w każdym miejscu spacji.
Jak widać, cały string się ładnie kopiuje wraz ze spacjami

#include <iostream>
#include <string>
using namespace std;

int main( int argc, char** argv )
{
	string myPath = argv[ 0 ];

	cout << myPath;
	for( string::iterator it = myPath.begin( ); it != myPath.end( ); ++it )
		if( *it == ' ' )
		{
			cout << "\n";
			*it = '\ ';
		}
	unsigned pos = myPath.find_last_of( '\\' );
	{
		string temp = myPath;
		myPath.assign( temp.begin( ), temp.begin( ) + pos + 1 );
	}

	cout << endl << myPath;
	myPath = "\"" + myPath + "nazwa_programu >> " + myPath + "nazwa_pliku\"";

	char tab[ 256 ];
	strcpy( tab, myPath.c_str( ) );

	cout << "\n\n" << tab << "\n\n";
	system( tab );
	getchar( );
	return 0;
}

Problem jest z instrukcją system. Jedno pytanie. Co tak naprawdę chcesz zrobić? Bo używanie system nie jest prawdę mówiąc wymagane w programach, gdyż wszystko można zastąpić kodem.

0
rabston napisał(a):

Muszę to wykorzystać w tym przypadku dlatego, że choć program, którego odpalam (bcdedit.exe) za pomocą cmd jest systemowy, to mam ściągniętą jego angielską wersję i wrzucam go razem do paczki z moim programem żeby mogli z niego korzystać również zagraniczni użytkownicy. Program bowiem wykorzystuje informacje o sektorze (już działając na plikach w sposób normalny, nie przez system() ) pobrane własnie z bcdedit.exe, pyta o klawisz jaki ma byc odpowiedzialny za uruchamianie go przy włączaniu komputera i generuje plik .bat, którego wystarczy potem odpalić aby zmiany zostały wprowadzone na stałe:) Taki program może byc bardzo przydatny np. gdy chcemy sobie wydzielic jakąś partycję, na której będziemy trzymać kopie zapasową elegancko zoptymalizowanego systemu i wrazie potrzeby można go postawić w mniej niż 10minut:) jak sami wiecie można go wykorzystać do wielu innych rzeczy. Później go gdzieś wam wrzucę!

nic, trudno. Najwyzej zrobie maly instalator, który będzie tworzyl zawsze folder na c:\folder\mojprogram.exe :)

wielkie dzieki za pomysły wszystkim!

1 użytkowników online, w tym zalogowanych: 0, gości: 1