![]() |
ExtractFilePath für C++
Hallo zusammen,
verzweifelt versuche ich schon die ganze Zeit das Anwendungsverzeichnis zu ermitteln, doch es will nicht so recht. Versucht habe ich es nach langem Suchen schließlich so:
Code:
Wenn ich mir das ausgeben lasse, schaut es jedoch so aus:
char * CMusikManager::SongpfadErmitteln(void)
{ char * pLetzteBackslashPos; unsigned int letzteBackslashPos; char programPfad[256]; char songpfad[256]; // Pfad zur Anwendung GetModuleFileNameA(NULL, programPfad, 256); // Exe-Namen entfernen pLetzteBackslashPos = strrchr(programPfad, '\\'); letzteBackslashPos = (int)(pLetzteBackslashPos - programPfad + 1); strncpy(songpfad, programPfad, letzteBackslashPos); // "\Songs\" anhängen strcat(songpfad, "\\Songs\\"); return songpfad; }
Code:
Ich vermute, im String bzw. Char-Array ist Zufalls-Zeugs enthalten, da ich die Länge auf 256 Zeichen festgelegt habe. Evtl. muss ich nur irgendwi ein #0 anhängen, doch das weiß ich nicht genau.
Anwendungspfad:
d:\Eigene Dateien\FHTE\Vorlesungen\Software Engineering1\Projekt_2\MusikManager\ Debug\MusikManager.exe Anwendungsverzeichnis: d:\Eigene Dateien\FHTE\Vorlesungen\Software Engineering1\Projekt_2\MusikMa nager\Debug\╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠d:\Eigene Dateien\FHTE\Vorlesungen\Software Engine ering1\Projekt_2\MusikManager\Debug\MusikManager.exe Endgültiger Pfad: d:\Eigene Dateien\FHTE\Vorlesungen\Software Engineering1\Projekt_2\MusikM anager\Debug\╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠d:\Eigene Dateien\FHTE\Vorlesungen\Software Engin eering1\Projekt_2\MusikManager\Debug\MusikManager.exe\Songs\ Was mache ich falsch bzw wie mache ich es richtig? Herauskommen sollte am Ende dieser Pfad: d:\Eigene Dateien\FHTE\Vorlesungen\Software Engineering1\Projekt_2\MusikManager\Debug\Songs\ Es grüßt Matze |
Re: ExtractFilePath für C++
uj, was machst du denn hier?
Code:
programPfad ist doch ein Array und plötzlich rechnest du damit?
letzteBackslashPos = (int)(pLetzteBackslashPos - programPfad + 1);
Zudem solltest du die Rückgabe von GetModuleFileNameA auswerten. Dann vom letzten zeischen rückwärts bis auf 0 oder den ersten Backslash gehen |
Re: ExtractFilePath für C++
Ich habe gelesen, um vom Pointer auf den Index zu kommen, muss man das so rechnen. Verstanden habe ich das, um ehrlich zu sein, nicht.
Das steht so in der MS-Doku:
Code:
// Search backward.
pdest = strrchr( string, ch ); result = (int)(pdest - string + 1); if ( pdest != NULL ) printf( "Result: last %c found at position %d\n", ch, result ); else printf( "Result:\t%c not found\n", ch ); |
Re: ExtractFilePath für C++
ich hab dir mal fix ExtractFilePath in c geschrieben:
Code:
void extract_file_path(char* path)
{ int i; for (i = strlen(path) - 1; (i >= 0) && (path[i] != '\\'); i--); path[i+1] = 0; } |
Re: ExtractFilePath für C++
Gibt es in C++ denn keine String-Klassen ?
Ich würde gerade in C++ Stringklassen immer diesen alten Techniken von C (char - Buffer fester Grösse) vorziehen. Mit Stringklassen sind Buffer Overuns quasi unmöglich und die Qualität wird gesteigert. |
Re: ExtractFilePath für C++
Jens, kann das sein, dass da ein Fehler drin ist?
Code:
void extract_file_path(char* path)
{ int i; for (i = strlen(path) - 1; (i >= 0) && (path[i] != '\\'); i--); //dieses Semikolon gehört IMO weg path[i+1] = 0; } |
Re: ExtractFilePath für C++
um das ganze mal auf c-ebene fertig zu stellen:
Code:
extract_file_path(programPfad);
strcat(programPfad, "Songs\\"); |
Re: ExtractFilePath für C++
Hallo,
Zitat:
Danke Jens. Das ist natürlich ein Weg, der einem im Normalfall ale erstes kommt, das komplett manuell zu lösen. Ich dachte nur, es geht auch einfacher. Ich werde das aber mal mit deinem Code versuchen. :) Gruß |
Re: ExtractFilePath für C++
ganz wichtig:
Code:
das solltest du unterlassen. Das ist wie in Delphi ein NoGo.
return songpfad;
Adressen auf lokale Variablen gibt man nicht zurück. Vielleicht lag da ja dein Fehler. Ahh, jetzt verstehe ich deinen Ausgangsquelltext. Ja, man kann das Array doch abziehen. Verständlicher ist es wenn du anstelle des Arrays dort die Adresse des Arrays nimmst (&array[0]) Mit deinen Funktionen würde es so aussehen
Code:
wobei songpfad eben keine lokale variable sein darf wenn du diese mit return zurück gibst. Übergebe diese Variable lieber als Parameter
programPfad[strrchr(programPfad, '\\') - &programPfad[0]] = 0;
strcpy(songpfad, programPfad); strcat(songpfad, "\\songs\\"); |
Re: ExtractFilePath für C++
:shock: stimmt! Das ist mir gar nicht aufgefallen. Ich vermisse den "string"-Datentyp in C++. Dieses Char-Pointer-Gefummel ist nervig. Irgendwie muss ich das aber zurückgeben können, ich wüsste jedoch nicht, wie ich das anders machen kann. Eine zeichenkette ist nunmal ein Pointer auf einen Char bzw. auf ein Char-Array.
Nachdem ich deinen Code so abgeändert habe:
Code:
geht er. :)
for (int i = strlen(pfad) - 1; (i > 0) && (pfad[i] != '\\'); i--)
{ pfad[i] = 0; } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz