Seite 1 von 2
chdir() einen String übergeben
Verfasst: Mo Mai 12, 2014 11:05 am
von miskin
Hallo
Hab ein Problem mit chdir().
In ein Verzeichniss zuwechseln welches ich direkt in die Methode eingebe ist möglich chdir("\home\....");
Aber ich möchte gern flexibel sein und das Verzeichniss selber angeben, da man ja vielleicht öffters das Verzeichniss wechseln möchte.
Wenn ich das eingelesene Verzeichniss in einem char array(String) oder auch das ganze mit einem Pointer versehe und dann in die chdir Methode schreibe
öffnet er immer nur das Verzeichniss indem ich mich befinde.
hier mein Codeausschnitt:
Code: Alles auswählen
getcwd(Verzeichniss,sizeof(Verzeichniss));
printf("%s $ \n",Verzeichniss);
.
.
.
void dirMethode(char neues_verzeichniss[]){ //in neues_verzeichniss steht /home/miskin/meinProjekt
chdir(neues_verzeichniss);
getcwd(Verzeichniss,sizeof(Verzeichniss));
printf("%s $ \n",Verzeichniss); //die Ausgabe ist immernoch im alten Verzeichniss
.
.
.
LG
EDIT dani93:
Code-Tags
Re: chdir() einen String übergeben
Verfasst: Mo Mai 12, 2014 12:11 pm
von nufan
Hallo
Kannst du bitte ein auf das wesentlich gekürzte Testprogramm hier posten und auch dazu angeben wie du es kompilierst? Und bitte Code-Tags verwenden

Re: chdir() einen String übergeben
Verfasst: Mo Mai 12, 2014 1:04 pm
von miskin
Hallo
Also ich benutze Geany das mir das kompilieren abnimmt soll ich mein ganzez Prog. hier einfügen?
LG
Re: chdir() einen String übergeben
Verfasst: Mo Mai 12, 2014 1:08 pm
von nufan
miskin hat geschrieben:Also ich benutze Geany das mir das kompilieren abnimmt soll ich mein ganzez Prog. hier einfügen?
Wenn es nicht zu lang ist, ja. Ansonsten bitte auf das Wesentliche kürzen.
Re: chdir() einen String übergeben
Verfasst: Mo Mai 12, 2014 1:38 pm
von miskin
Hi
es tut mir leid das das so lang ist hoffe das man es verstehen kann
Code: Alles auswählen
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include <sys/types.h>
#include <dirent.h>
FILE *f;
DIR *dir;
struct dirent *dirzeiger;
off_t pos;
char input[256],inputmod[256];
char Verzeichnis[256];
char Verzeichniss[256];
char Verzeichniss_neu[256];
char strtemp[256];
char ls[]="ls";
char change_dir[]="cd";
char grep[]="grep";
char pipes[]="|";
char *date="date";
char *raus="exit";
char *a;
char *ptr4vek[1000];
int proNotFound = 1,laengeInput,cd_aufruf=0,cd_int=0;
int ls_zaehler=0;
char *ptr,*ptr5,*ptr4,*ptr6;
/*******************************************
* Funktion lsMethode soll Verzeichnissinhalt
* ausgeben.
******************************************/
void lsMethode(char ls[]){
int h=0,i=0;
dir = opendir(ls);
while ((dirzeiger=readdir(dir)) != NULL )
{
a=&dirzeiger->d_name;
ptr4 = strtok(a,"");
while(ptr4 != NULL) {
ptr4vek[h++]=ptr4; //Token in ein Array speichern
ptr4 = strtok(NULL, "\t \n");
}
}
//hier wird nur ausgegeben was nicht mit Punkt anfaengt
for(i=0;i<h;i++){
ptr5=strncmp(ptr4vek[i],".",1)? "OK" : "KO";
if(ptr5=="OK") printf("%s\n",ptr4vek[i]);
}
closedir(dir);
return;
}/**ENDE lsMethode***/
[color=#804040] /*******************************************
* Funktion dirMethode soll Verzeichniss
* wechseln.
******************************************/
void dirMethode(char dire[]){
int i=1,j=3;
for(i=1;i<=strlen(dire)-3;i++){
strtemp[i]=dire[j];j++;}
strtemp[strlen(strtemp)]='\0';
ptr6=strtemp;
chdir(ptr6); // chdir("/home/student");
getcwd(Verzeichniss_neu,sizeof(Verzeichniss_neu));
printf("Das aktuelle Arbeitsverzeichnis ist:\n%s\n",Verzeichniss_neu);
return;
}/**ENDE dirMethode***/[/color]
int main(int argc, char *argv[])
{
int i = 0;
int strlaenge;
weiter:
proNotFound=1;
/**Ausgabe des aktuellen Verzeichnisses**/
getcwd(Verzeichnis,sizeof(Verzeichnis));printf("%s $ ",Verzeichnis);
/**ENDE**/
/**Einlesen der Tastatureingebe**/
fgets(input,sizeof(input),stdin); //GANZE tastatureingabe in input gespeichert
/**ENDE**/
/**Loeschen des Enterzeichens***/
for(i=0;i<strlen(input);i++) {
inputmod[i]=input[i];
}
strlaenge=strlen(inputmod)+1;
inputmod[strlaenge]='\0';
/**ENDE**/
int z=0;
ptr = strtok(input, "\t \n");
while(ptr != NULL) {
z++;
ptr = strtok(NULL, "\t \n");
}
/**Wenn nur ein Argument eingetippt wird***/
if(z==1) {
ptr = strtok(input, "\t \n");
if( (strcmp(ptr,ls)==0)&&(ls_zaehler==0) )
lsMethode(Verzeichnis);
if( (strcmp(ptr,ls)==0)&&(ls_zaehler!=0) )
lsMethode(Verzeichniss_neu);
if(strcmp(ptr,raus)==0)return 0;
z = 0; goto weiter;
}
/**ENDE**/
/**Wenn echo gefolgt von Argumenten***/
if(z>1) {
ptr = strtok(input, "\t \n");
if(strcmp(ptr,change_dir)==0){
dirMethode(inputmod); }
z=0; goto weiter;
}
/**ENDE**/
/**Wenn nur eingetippt wird, Leerzeile ausgeben***/
/**ENDE**/
return 0;
}
Edit by cloidnerux: Code-Tags
Re: chdir() einen String übergeben
Verfasst: Mo Mai 12, 2014 1:50 pm
von nufan
Ich hab deinen Code mal auf die Länge gekürzt die ich erwartet hätte:
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
char Verzeichniss_neu[256];
char strtemp[256];
void dirMethode(char dire[])
{
int i=1,j=3;
for(i=1;i<=strlen(dire)-3;i++)
{
strtemp[i]=dire[j];j++;
}
strtemp[strlen(strtemp)]='\0';
chdir(strtemp);
getcwd(Verzeichniss_neu,sizeof(Verzeichniss_neu));
printf("Das aktuelle Arbeitsverzeichnis ist:\n%s\n",Verzeichniss_neu);
return;
}
int main()
{
dirMethode("test");
return 0;
}
chdir() gibt dir einen int als Rückgabewert zurück. Zitat aus der Manpage:
Code: Alles auswählen
On success, zero is returned. On error, -1 is returned, and errno is set appropriately.
Du kannst also den Rückgabewert speichern und falls er ungleich 0 ist mit
Code: Alles auswählen
#include <string.h>
#include <errno.h>
// ...
printf("error: %s\n", strerror(errno));
eine passende Fehlermeldung ausgeben lassen.
Noch ein Tipp: Gib dir dein strtemp vor dem chdir()-Aufruf aus.
Re: chdir() einen String übergeben
Verfasst: Mo Mai 12, 2014 1:56 pm
von cloidnerux
Kurz zum Thema guter Progammierstil:
Code: Alles auswählen
#include <dirent.h>
FILE *f;
DIR *dir;
struct dirent *dirzeiger;
off_t pos;
char input[256],inputmod[256];
char Verzeichnis[256];
char Verzeichniss[256];
char Verzeichniss_neu[256];
char strtemp[256];
char ls[]="ls";
char change_dir[]="cd";
char grep[]="grep";
char pipes[]="|";
char *date="date";
char *raus="exit";
char *a;
char *ptr4vek[1000];
int proNotFound = 1,laengeInput,cd_aufruf=0,cd_int=0;
int ls_zaehler=0;
char *ptr,*ptr5,*ptr4,*ptr6;
Du Deklarierst hier eine reihe Variablen, aber Global. Das sollte man so gut es geht vermeiden. Zum einen verbaust du dir dadurch Schlüsselwörter, du kannst in keiner Unterfunktion eine neue Variable "raus" oder "date" definieren, weil du das schon mal Global gemacht hast. Zudem verlierst du die Kontrolle, in welcher Variable wo etwas gelesen oder geschrieben wird, was die Variable eigentlich machen soll oder was sie bedeutet.
Man sollte Variablen nur innerhalb der Funktion deklarieren, in der sie genutzt wird.
Das erleichtert dir auch das Fehler finden. Ohne Globale Variablen hängt das Ergebnis einer Funktion rein von den übergebenen Parametern und dem Code ab und nicht mehr.
Dann zu deiner Methode:
Code: Alles auswählen
int i=1,j=3;
for(i=1;i<=strlen(dire)-3;i++){
strtemp[i]=dire[j];j++;}
Etwas überflüssig das ganze. Wozu schneidest du etwas vom Ende ab?
Warum diese Zuweisung, diese hat keine Auswirkung.
Was ist überhaupt deine Fehlermeldung?
Ich würde das ganze etwa so aufbauen:
Code: Alles auswählen
void dirMethode(char * dir) //Kein Array sondern ein Pointer übergeben
{
char * tmp = malloc(255); //Bisschen Speicher reservieren
//dir[strlen(dir) - 2] = '\0'; //Bisschen was vom ende Abschneiden, warum eigentlich?
chdir(dir);
getcwd(tmp,255);
printf("Das aktuelle Arbeitsverzeichnis ist:\n%s\n",tmp);
free(tmp);
}
Re: chdir() einen String übergeben
Verfasst: Mo Mai 12, 2014 8:37 pm
von miskin
vielen Dank erstmal ich muss mich mit malloc einbischen auseinander setztn
Hab das mal mit deiner dirMethode ausprobiert aber leider kein Erfolg.
ind dir ist zwar das Verzeichniss in das gewechselt werden soll aber tmp gibt aktuelles
Verzeichniss aus.
LG
Re: chdir() einen String übergeben
Verfasst: Mo Mai 12, 2014 8:46 pm
von miskin
Hier noch meine Ausgabe:
/home/student/hhush $ cd /home
Pointerinhalt vor Methodenaufruf : /home
Das aktuelle Arbeitsverzeichnis ist:
/home/student/hhush
/home/student/hhush $
Re: chdir() einen String übergeben
Verfasst: Di Mai 13, 2014 1:33 pm
von miskin
Hallo
Vielen Dank erst einmal an alle.
Eure Anmerkungen und Vorschläge haben mir sehr geholfen.Wie gesagt bin ich ein Anfänger und für jeden Rat auch wenn Kritik ist,denn so lernt man ja.
Hab jetzt fast alle Variablen in die Methoden gepackt und die Methode von CLOIDNERUX benutzt.
Nach viel hin und her funktioniert der Verzeichniss wechsel.
Ich werde jetzt die nächsten Methoden bearbeiten und hoffe auf eure weitere Hilfe.
bis dann,
LG