Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ExtractFilePath für C++ (https://www.delphipraxis.net/104272-extractfilepath-fuer-c.html)

Matze 30. Nov 2007 14:30


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:
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;
}
Wenn ich mir das ausgeben lasse, schaut es jedoch so aus:

Code:
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\
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.
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

SirThornberry 30. Nov 2007 14:35

Re: ExtractFilePath für C++
 
uj, was machst du denn hier?
Code:
letzteBackslashPos = (int)(pLetzteBackslashPos - programPfad + 1);
programPfad ist doch ein Array und plötzlich rechnest du damit?
Zudem solltest du die Rückgabe von GetModuleFileNameA auswerten.
Dann vom letzten zeischen rückwärts bis auf 0 oder den ersten Backslash gehen

Matze 30. Nov 2007 14:41

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 );

SirThornberry 30. Nov 2007 14:44

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;
}

shmia 30. Nov 2007 14:44

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.

DeddyH 30. Nov 2007 14:47

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;
}

SirThornberry 30. Nov 2007 14:49

Re: ExtractFilePath für C++
 
um das ganze mal auf c-ebene fertig zu stellen:
Code:
extract_file_path(programPfad);
strcat(programPfad, "Songs\\");

Matze 30. Nov 2007 14:51

Re: ExtractFilePath für C++
 
Hallo,

Zitat:

Zitat von shmia
Gibt es in C++ denn keine String-Klassen ?

bei einer .NET-Anwendung ja (wobei das die Klassen von .NET sind). Sonst weiß ich es nicht genau.

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ß

SirThornberry 30. Nov 2007 14:53

Re: ExtractFilePath für C++
 
ganz wichtig:
Code:
return songpfad;
das solltest du unterlassen. Das ist wie in Delphi ein NoGo.
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:
programPfad[strrchr(programPfad, '\\') - &programPfad[0]] = 0;
strcpy(songpfad, programPfad);
strcat(songpfad, "\\songs\\");
wobei songpfad eben keine lokale variable sein darf wenn du diese mit return zurück gibst. Übergebe diese Variable lieber als Parameter

Matze 30. Nov 2007 15:01

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:
for (int i = strlen(pfad) - 1; (i > 0) && (pfad[i] != '\\'); i--)
{
   pfad[i] = 0;
}
geht er. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:11 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz