Problem mit Pfadangaben - Leerzeichen

Thurstan

Mitglied
Hallo Leute,

ich bin grad erst in c++ eingestiegen und auf ein Problem gestoßen...arbeite an einem veralteten Programm (was ich nicht selbst programmiert habe)
Ich arbeite mit dem Borland C++ Builder 6.0...


Dieser erzeugte Buffer:
0 0 EXTRACTC "d:\temp leer\01\01.txt" "d:\temp leer\02\01.txt" "d:\temp leer\03\01.txt" 3


wird jetzt weitergegeben und steht in Query;

dazu wird noch ein Datei erstellt in der der Query und ein zielpfad reingeschrieben wird...
Code:
fprintf(File,"%s\n%s\n",Query,AnswerFileName);


Der Inhalt der Datei sieht jetzt so aus:
Code:
0 0 EXTRACTC "d:\temp leer\01\01.txt" "d:\temp leer\02\01.txt" "d:\temp leer\03\01.txt" 3
C:\temp1\test.txt

da das ganze aber an einen Server geschickt wird...bekomme ich jetzt Syntax error - denn normalerweise müsste der Inhalt der Datei so aussehen:
Code:
0 0 EXTRACTC d:\temp\01\01.txt d:\temp\02\01.txt d:\temp\03\01.txt 3
C:\temp1\test.txt

sprich ohne die Anführungszeichen...aber wie schütze ich dann die Pfadangaben mit Leerzeichen ? :confused:


Vielen Dank für eure Hilfe - ich hoffe ihr versteht mein problem :suspekt:
 
Hallo,

Um einen Pfad mit Leerzeichen nutzen zu können, brauchst du die Anführungszeichen, soweit ich weiß.

Du kannst ja mal sowas probieren.

Code:
0 0 EXTRACTC \"d:\temp leer\01\01.txt\" \"d:\temp leer\02\01.txt\" \"d:\temp leer\03\01.txt\" 3
C:\temp1\test.txt
quasi vor jedem " noch ein \ ...

aber der c:\temp Pfad dürfte nicht gehen.
Der sollte so aussehen:
Code:
C:\\temp1\\test.txt

Vielleicht hilft das ja...

MfG Turri
 
Hi.
Vielen Dank für eure Hilfe - ich hoffe ihr versteht mein problem :suspekt:
Nein, ehrlich gesagt verstehe ich dein Problem nicht. Offenbar generierst du eine Datei die von einem Server zurückgewiesen wird. Was hat das ganze denn jetzt mit C/C++ zu tun? Woher sollen wir denn das Format kennen, das dein Server erwartet?

Gruß
 
Ersteinmal vielen Dank für Eure Antworten! Jetzt wird mir das Problem auch immer klarer...und ich weiß was ihr meint...

ich versuchs nochmal - aber ersteinmal anders:

Also dieses hier ist der String:
0 0 EXTRACTC d:\temp\01\01.txt d:\temp\02\01.txt d:\temp\03\01.txt 3
C:\temp1\test.txt

und dieser wird jetzt mittels sscanf eingelesen...bis dato klappt es auch, nun ist aber das Problem: was mach ich mit Pfadangaben mit Leerzeichen ?

muss ich da den String vorher abändern? denn sscanf springt ja nach jedem Leerzeichen weiter - oder gibt es eine ander Funktion dafür?
 
Also dieses hier ist der String:

und dieser wird jetzt mittels sscanf eingelesen...bis dato klappt es auch, nun ist aber das Problem: was mach ich mit Pfadangaben mit Leerzeichen ?

muss ich da den String vorher abändern? denn sscanf springt ja nach jedem Leerzeichen weiter - oder gibt es eine ander Funktion dafür?
Fragt sich nur wann die Pfadangabe denn nun abgeschlossen ist? Du könntest z.B. ein Trennzeichen wählen, welches nicht in Pfadangaben auftreten kann (z.B. "|"). Das einfachste wäre die Pfadangaben einfach jeweils auf eine extra Zeile zu schreiben. Dann kannst du die Zeilen einfach mit fgets einlesen.

Wenn das nicht geht, oder du das nicht möchtest, wäre es trotzdem zweckmäßig erstmal die komplette Zeile mit fgets einzulesen und dann entsprechend weiterzuverarbeiten. Falls die Pfadangaben immer absolut sind (und nur Windows), wäre es z.B. möglich nach dem 2ten Doppelpunkt zu suchen und 2 Zeichen davor den ersten Pfad als beendet anzusehen.

Gruß
 
Wenn das nicht geht, oder du das nicht möchtest, wäre es trotzdem zweckmäßig erstmal die komplette Zeile mit fgets einzulesen und dann entsprechend weiterzuverarbeiten. Falls die Pfadangaben immer absolut sind (und nur Windows), wäre es z.B. möglich nach dem 2ten Doppelpunkt zu suchen und 2 Zeichen davor den ersten Pfad als beendet anzusehen.

Ja Danke - diesen Vorschlag würde ich vorerst in Betracht ziehen, hab da auch ersteinmal etwas rumgewerkelt...


Hier der Code-Auszug:
Code:
char paths[80];
char *temp;
char *search = ":";
FILE *datei;
 
datei = fopen(ExpArg[0], "r");
if(NULL == datei) {
    printf("Konnte Datei nicht öffnen!\n");
    return EXIT_FAILURE;
}

fgets(paths, 500, datei);
temp = strpbrk(paths, search);
 cout << temp << endl;

soweit erstmal der code - bis dahin funktionierts auch - jetzt hab ich nur 2 Fragen...

bei der fgets - Funktion ist der 2 Parameter ja int n...
habs deswegen mal mit
Code:
fgets(paths, strlen(paths), datei)
versucht allerdings bekomm ich dann dies:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt ****.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 3264E7F0. Lesen von Adresse 00000000'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe

wie bekomm ich das besser hin ?



und nun zum anderen Problem...temp gibt mir jetzt den String vom ":" ab an - wie richte ich den zeiger eine position weiter nach vorne - und wie lese ich dann die anderen 3 Pfade aus ? Da muss ich mir doch sicherlcih eine Schleife basteln oder ?
 
Code:
char paths[80];
char *temp;
char *search = ":";
FILE *datei;
 
datei = fopen(ExpArg[0], "r");
if(NULL == datei) {
    printf("Konnte Datei nicht öffnen!\n");
    return EXIT_FAILURE;
}

fgets(paths, 500, datei);
temp = strpbrk(paths, search);
 cout << temp << endl;

soweit erstmal der code - bis dahin funktionierts auch - jetzt hab ich nur 2 Fragen...

bei der fgets - Funktion ist der 2 Parameter ja int n...
habs deswegen mal mit
Code:
fgets(paths, strlen(paths), datei)
versucht allerdings bekomm ich dann dies:
Du hast vergessen den String zu terminieren und die strlen Funktion sucht solange nach dem Terminierungszeichen bis es gefunden ist - was auf einen Fehler hinausläuft wenn der zugewiesene Speicherbereich verlassen wird.

Die Anzahl der Elemente eines statischen Arrays ermittelt man so:
C:
int maxSize = sizeof(paths)/sizeof(*paths);
Es ist übrigens auch keine gute Idee als zweiten Parameter 500 anzugeben, wenn das Array nur 80 Zeichen groß ist.

und nun zum anderen Problem...temp gibt mir jetzt den String vom ":" ab an - wie richte ich den zeiger eine position weiter nach vorne
C:
temp++;
- und wie lese ich dann die anderen 3 Pfade aus ? Da muss ich mir doch sicherlcih eine Schleife basteln oder ?
Ja. Du musst solange iterieren bis du keine Doppelpunkte mehr findest.

Gruß
 
okay wieder was gelernt...aber jetzt gehen mir schon wieder die mittel aus


Code:
char paths[80];
char *temp;
char *search = ":";
FILE *datei;
 
datei = fopen(ExpArg[0], "r");
if(NULL == datei) {
    printf("Konnte Datei nicht öffnen!\n");
    return EXIT_FAILURE;
}

int maxSize = sizeof(paths)/sizeof(*paths);
fgets(paths, maxSize, datei);

temp = strpbrk (paths, search);

 while (temp != NULL)
 {
    temp--;
    cout << "Temp:  " << temp << endl;
    temp = temp + 2;
    temp = strpbrk (temp, search);
 }

so hab ich nach jedem Schleifendurchlauf den Zeiger auf den Start meines gesuchten Strings..aber mit welchen Mitteln schneide ich den jetzt den Bereich bis zum Ende des Pfades aus....welche Funktion ist mein Freund ?

oder muss ich noch das Ende des Stings finden ? aber dennoch bleibt für mich die Frage wie ich den Bereich also den Pfad in einen String speichern kann..
 
so hab ich nach jedem Schleifendurchlauf den Zeiger auf den Start meines gesuchten Strings..aber mit welchen Mitteln schneide ich den jetzt den Bereich bis zum Ende des Pfades aus....welche Funktion ist mein Freund ?
Du mußt den Start des nächsten Strings auch noch suchen. Das kannst du entweder mit der strpbrk bzw. strchr Funktion machen.

oder muss ich noch das Ende des Stings finden ? aber dennoch bleibt für mich die Frage wie ich den Bereich also den Pfad in einen String speichern kann..
strncpy

Gruß
 
Oh man ist das eine schwere Geburt:

Code:
char paths[80];
char *temp;
char *temp2;
char *temp3;
char *search = ":";
char *search2 = ".";
FILE *datei;
 
datei = fopen(ExpArg[0], "r");
if(NULL == datei) {
    printf("Konnte Datei nicht öffnen!\n");
    return EXIT_FAILURE;
}

int maxSize = sizeof(paths)/sizeof(*paths);
fgets(paths, maxSize, datei);

temp = strpbrk (paths, search);

 while (temp != NULL)
 {     
    temp2 = strpbrk (temp, search2);
    temp2 = temp2 + 4;

    strncpy (temp3, temp, temp2);
    temp = temp + 2;
    temp = strpbrk (temp, search);   
 }

Jetzt scheitert es an der strncpy funktion:

"E2034 Konvertierung von 'int' nach 'const char *' nicht möglich" - temp und temp2 sind ja zeiger wenn ich das richtig verstehe - aber scheinbar wird etwas anderes erwartet...wie wandel ich die zeiger um und was wird überhaupt erwartet ?
 
Zurück