AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ExtractFilePath für C++

Ein Thema von Matze · begonnen am 30. Nov 2007 · letzter Beitrag vom 30. Nov 2007
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

ExtractFilePath für C++

  Alt 30. Nov 2007, 14:30
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: ExtractFilePath für C++

  Alt 30. Nov 2007, 14:35
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: ExtractFilePath für C++

  Alt 30. Nov 2007, 14:41
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 );
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: ExtractFilePath für C++

  Alt 30. Nov 2007, 14:44
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;
}
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: ExtractFilePath für C++

  Alt 30. Nov 2007, 14:44
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: ExtractFilePath für C++

  Alt 30. Nov 2007, 14:47
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;
}
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: ExtractFilePath für C++

  Alt 30. Nov 2007, 14:49
um das ganze mal auf c-ebene fertig zu stellen:
Code:
extract_file_path(programPfad);
strcat(programPfad, "Songs\\");
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: ExtractFilePath für C++

  Alt 30. Nov 2007, 14:51
Hallo,

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ß
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: ExtractFilePath für C++

  Alt 30. Nov 2007, 14:53
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: ExtractFilePath für C++

  Alt 30. Nov 2007, 15:01
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:30 Uhr.
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