Ansi-C - Probleme mit der String-Verarbeitung

DaRealMC

Erfahrenes Mitglied
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main() {

char *user;
char logdatei[32];
FILE *log;
char zeile[1000];
char pstdatei[500];
char *ort;
char pfad_alt[1000];
char pfad_neu[1000];
char pfad_temp[1000];
char lw[1];

system("cls");
user = getenv ( "USERNAME" );

if (user != NULL) { //Pfad fuer Logdatei bauen
	strcpy(logdatei, "h:\\__pst_");
	strcat(logdatei, user);
	strcat(logdatei, ".log");
	printf("Bearbeite Datei: %s\n",logdatei);
}
else {
	printf("Fehler beim lesen des Users\n");
	exit(1);
}

  if((log = fopen(logdatei, "r"))==NULL) {
    printf("Kann Logdatei nicht oeffnen.\n");
    exit(1);
  }

 while(!feof(log)) {  //so lange Datei nicht zu Ende
    fgets(zeile, 1000, log); //Zeile auslesen
		if(ort = strstr(zeile, "von ")) {  //wenn die Zeile mit 'von ' beginnt

			strncpy(pfad_alt,ort+4,1000);				//Pfad zur Datei auslesen
			strncpy(lw,ort+4,1);						//Laufwerk auslesen - geht nicht...
			strcpy(pfad_neu, "\\\\ZENTRAL\\LAPTOP\\");  //neuen Pfad zusammenbauen
			strcat(pfad_neu, user);
			strcat(pfad_neu, "\\");
			strcat(pfad_neu, lw);						//Laufwerksbuchstabe anhaengen - geht nicht...
			strncat(pfad_neu,pfad_alt+2,1000);			//alten Pfad anhaengen - geht nicht...
			//printf("%s", pfad_alt+2); //das geht seltsamerweise
			printf("mkdir %s",pfad_neu);
			printf("copy %s\\*.pst %s\\",pfad_alt, pfad_neu);

}
}
fclose(log);
}

Was ich vor habe: bei jedem User liegt auf h: eine Datei namens __pst_%USERNAME%.log (dir *.pst /s >__pst_%USERNAME%.log)
Diese soll geöffnet werden und jede darin auftretende Zeile verarbeitet werden.
Jedesmal, wenn eine Zeile " Verzeichnis von " enthält, soll aus dieser der Pfad kopiert werden
1. Problem: er nimmt IMMER das \n am Ende mit. Habe es schon mit strlen(pfad-1) usw probiert. Kein Erfolg.
Dieser gewonnene Pfad soll gleichzeitig auch als neuer Pfad auf einem andren Server dienen. Davor soll noch der Laufwerksbuchstabe als Ordner gestellt werden. Auch das funktioniert nicht.
Und das dritte Problem ist, dass obwohl ich ihm sage, dass er den alten Pfad erst ab Position 3 kopieren soll, nimmt er immer schon das Laufwerk mit.
Ich hoffe, sowohl der Code wie auch meine Beschreibung sind deutlich genug ^^

Ach ja: so sieht eine Datei aus:
Code:
 Volume in Laufwerk C: hat keine Bezeichnung.
 Volumeseriennummer: xxx

 Verzeichnis von c:\Documents and Settings\Tester\Local Settings\Application Data\Microsoft\Outlook

14.12.2007  11:48           271.360 archive.pst
               1 Datei(en)        271.360 Bytes

 Verzeichnis von c:\Dokumente und Einstellungen\Tester\Lokale Einstellungen\Anwendungsdaten\Microsoft\Outlook

14.12.2007  11:48       270.222.336 archive2.pst
               1 Datei(en)    270.222.336 Bytes

 Verzeichnis von c:\Dokumente und Einstellungen\Tester\Lokale Einstellungen\Application Data\Microsoft\Outlook

20.07.2004  13:34           271.360 Outlook.pst
               1 Datei(en)        271.360 Bytes

     Anzahl der angezeigten Dateien:
               3 Datei(en)    270.765.056 Bytes
               0 Verzeichnis(se),  2.349.694.976 Bytes frei
 Datentr„ger in Laufwerk D: ist Daten
 Volumeseriennummer: xxx

 Verzeichnis von d:\Sicherungen

21.06.2007  16:09       552.616.960 archive.pst
               1 Datei(en)    552.616.960 Bytes

     Anzahl der angezeigten Dateien:
               1 Datei(en)    552.616.960 Bytes
               0 Verzeichnis(se),  9.662.263.296 Bytes frei
 
Hi.
Code:
void main() {
Laut C Standard muss die Funktion main int zurückgeben.
Code:
 while(!feof(log)) {  //so lange Datei nicht zu Ende
    fgets(zeile, 1000, log); //Zeile auslesen
Die Funktion eof brauchst du eigentlich fast nie. So prüfst du gar nicht ob du die Zeile erfolgreich eingelesen hast.
C:
while (fgets(zeile, 1000, log) != NULL) {
Wenn es dich interressiert kannst du nachdem die Schleife beendet wurde immer noch mit feof() bzw. ferror() feststellen ob ein Fehler aufgetreten, oder einfach das Ende der Datei erreicht wurde...
Code:
		if(ort = strstr(zeile, "von ")) {  //wenn die Zeile mit 'von ' beginnt
Hier suchst du nach "von " irgendwo in der Zeile. Ich würde einfach testen, ob die Zeile mit
" Verzeichnis von " beginnt:
C:
char vz[] = " Verzeichnis von ";
if (strncmp(zeile, vz, strlen(vz)) == 0) {
Code:
strncpy(lw,ort+4,1);  //Laufwerk auslesen - geht nicht...
Die Funktion strncpy terminiert den Ziel-String nicht, falls der Quell-String länger als die angegebene Maximallänge ist. D.h. du mußt hier den String noch terminieren. Dann musst du allerdings auch 2 Zeichen für den String reservieren!
C:
char lw[2];
strncpy(lw, ort + 4, 1);
lw[1] = '\0';
Gruß
 
Danke, hat schon mal sehr geholfen. Jetzt habe ich noch das Problem, dass pfad_alt und pfad_neu am Ende noch ein newline haben, welches ich nicht weg bekomme.

C:
i=strlen(pfad_alt);
pfad_alt[i-1]='\0';
i=strlen(pfad_neu);
pfad_neu[i-1]='\0';

jetzt geht's :D

noch ein bisschen testen, aber ich glaub, ich kann das hier dann als erledigt markieren. Danke
 
Zuletzt bearbeitet:
C:
i=strlen(pfad_alt);
pfad_alt[i-1]='\0';
i=strlen(pfad_neu);
pfad_neu[i-1]='\0';

jetzt geht's :D
Richtig. fgets liest das Zeilenendezeichen immer noch mit ein. Außer wenn EOF auftritt bevor ein \n gelesen wurde. D.h. du solltest erstmal testen, ob das was du überschreibst überhaupt ein \n ist.

Gruß

PS: das Abschneiden des \n Zeichens müßtest du nur einmal mit der Variable zeile machen.
 
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>


void support(int);


int main(void) {

char *user;
char dateiname[1000];
char dateiname2[1000];
char logdatei[32];
FILE *log;
char zeile[1000];
char pfad_alt[1000];
char pfad_neu[1000];
char lw[2];
char vz[] = " Verzeichnis von ";
int i;
char copy[1000];
char mkdir[1000];


system("title PST-Sicherung");
clrscr();
textcolor(WHITE);
textbackground(LIGHTRED);
printf("\t!!STARTEN SIE AUF KEINEN FALL OUTLOOK, \n\tSO LANGE DIESES FENSTER NICHT GESCHLOSSEN IST!!\n");
textcolor(LIGHTGRAY);
textbackground(BLACK);
user = getenv ( "USERNAME" );

if (user != NULL) { 											//Pfad fuer Logdatei bauen
	strcpy(logdatei, "h:\\__pst_");
	strcat(logdatei, user);
	strcat(logdatei, ".log");
	//printf("Bearbeite Datei: %s\n",logdatei);
}
else {

	support(1);
}

if((log = fopen(logdatei, "r"))==NULL) {

    support(2);
}

while (fgets(zeile, 1000, log) != NULL) {  						//Zeile auslesen
	if (strncmp(zeile, vz, strlen(vz)) == 0) { 					//Nur Zeilen mit ' Verzeichnis von ' verarbeiten
			i=strlen(zeile);
			if (zeile[i-1] == '\n') {
				zeile[i-1]='\0';								//am Ende der Zeile das NewLine wegnehmen
				strncpy(pfad_alt,zeile+17,1000);				//Pfad zur Datei auslesen
				strncpy(lw, zeile + 17, 1);						//Laufwerk auslesen
				lw[1] = '\0';									//am Ende der Zeile das NewLine wegnehmen
				strcpy(pfad_neu, "\\\\ZENTRAL\\LAPTOP\\");	//neuen Pfad zusammenbauen
				strcat(pfad_neu, user);
				strcat(pfad_neu, "\\");
				strcat(pfad_neu, lw);							//Laufwerksbuchstabe anhaengen
				strncat(pfad_neu,pfad_alt+2,1000);				//alten Pfad anhaengen
				strcpy(mkdir, "mkdir \"");
				strcat(mkdir, pfad_neu);
				strcat(mkdir, "\"");
				system(mkdir);
				//printf("copy /Y %s\\*.pst %s\\\n\n",pfad_alt, pfad_neu);
			}
	}
	else if (strstr(zeile, ".pst")) {
		i=strlen(zeile);
		if (zeile[i-1] == '\n') {
			zeile[i-1] ='\0';
			strncpy(dateiname,zeile+36,1000);
			strcpy(copy,"copy /Y \"");
			strcat(copy, pfad_alt);
			strcat(copy, "\\");
			strcat(copy, dateiname);
			strcat(copy, "\" \"");
			strcat(copy, pfad_neu);
			strcat(copy, "\"");
			system(copy);

		}
	}
}


fclose(log);

}



void support(errnr) {
	char ch;
	printf("\nEs ist ein Fehler aufgetreten!\n");
	printf("Wenden Sie sich bitte an den Support\n\tFehler: ");
	switch (errnr) {
		case 1:
			printf("Fehler beim lesen des Users\n");
			break;
		case 2:
			printf("Kann Logdatei nicht oeffnen.\n");
			break;
	}
	do {
    	ch = getchar();
	}
	while (ch != '.');

	exit(1);


}

Ich glaube, so wird es morgen produktiv gehen ^^
 
Zurück