Zeiger Probleme



  • Hallo Zusammen,

    hab ein kleines Programm geschrieben das in eienm Verzeichniss sagen soll was Datei und was Verzeichniss ist. Bin noch C Anfänger und sehe deswegen nicht wo der Fehler bei stat ist oder wie ich ihn "umgehe". Danke im Vorraus

    Fehler: "13:5: warning: passing argument 1 of ‘stat’ makes pointer from integer without a cast [enabled by default]
    /usr/include/x86_64-linux-gnu/sys/stat.h:211:12: note: expected ‘const char * __restrict__’ but argument is of type ‘char’"

    Code

    #include<stdio.h>
    #include<string.h>
    #include<dirent.h>
    #include<stdlib.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include<sys/stat.h>
    
    int printFiles(char* file){
        struct stat attribut;
    
        printf("%s\n", file);
        if(stat(file, &attribut) == -1){
            fprintf(stderr, "Fehler bei stat\n");
            return EXIT_FAILURE;
        }
    
        //Prüfe ob übergebene file Datei oder Verzeichniss ist
        if(attribut.st_mode & S_IFREG){
            printf("Datei: %s\n", file);
        }else if(attribut.st_mode & S_IFDIR){
            printf("Verzeichniss: %s\n", file);
        }
    }
    
    int main(int argc, char* argv[]){
        DIR *dir;
        struct dirent *dirpointer;
        char punkt[] = ".";
        char punkte[] = "..";
    
        if(argc >= 2){
    	    //Öffnet übergebenes Verzeichniss
            if((dir=opendir(argv[1])) == NULL){
                fprintf(stderr, "Fehler bei opendir \n");
                return EXIT_FAILURE;
            }
    
            //Liest Verzeichniss in dir und übergibt es printFiles
            while((dirpointer=readdir(dir)) != NULL){
                if(strcmp((*dirpointer).d_name, punkt) != 0 && strcmp((*dirpointer).d_name, punkte) != 0){ 
                    printf("%s\n", (*dirpointer).d_name);
                    printFiles((*dirpointer).d_name);
                }
            }
    
            //Schließt dir 
            if(closedir(dir) == -1){
                printf("Fehler beim Schließen von %s\n", argv[1]);
            }   
        }
        return 0;
    }
    


  • worksforme
    Es gibt allerdings weitere Fehler.
    Schau dir mal perror(3) und strerror(3) für dein Errorhandling an.



  • aber warum wirft der bei mir den fehler?



  • Vincent123 schrieb:

    aber warum wirft der bei mir den fehler?

    Bei mir kompilierts auch (ausser dass er sich bei S_IFREG beschwert). Bist du sicher, dass du genau den Code gepostet hast, bei dem dieser Fehler auftritt?

    Ich habe selber stat(..) noch nie verwendet aber gemäss Doku sieht dein Aufruf korrekt aus. Dort sollte kein Compilerfehler auftreten.



  • der gibt mir ja nur die warnung aber wenn file ein verzeichniss ist dann gibt stat nen fehler zurück bei dateien funktionierts



  • Das muss

    if ((attribut.st_mode & S_IFMT) == S_IFREG)
    oder
    if (S_ISREG(attribut.st_mode))
    

    heißen und ist außerdem kein C-Standard sondern gehört nach POSIX.



  • Danke


  • Mod

    Vincent123 schrieb:

    der gibt mir ja nur die warnung aber wenn file ein verzeichniss ist dann gibt stat nen fehler zurück bei dateien funktionierts

    Da gibt's bei uns auch keine Warnung. Bist du wirklich 100% sicher, den richtigen Code gezeigt zu haben?



  • Also wenn ich mit

    gcc -Wall datei.c -o datei
    

    kompiliere gibt der die Warnung :
    datei.c: In function ‘printFiles’:
    datei.c:13:5: warning: passing argument 1 of ‘stat’ makes pointer from integer without a cast [enabled by default]
    /usr/include/x86_64-linux-gnu/sys/stat.h:211:12: note: expected ‘const char * __restrict__’ but argument is of type ‘char’
    backup.c:24:1: warning: control reaches end of non-void function [-Wreturn-type]

    #include<stdio.h>
    #include<string.h>
    #include<dirent.h>
    #include<stdlib.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include<sys/stat.h>
    
    int printFiles(char* file){
        struct stat attribut;
    
        printf("%s\n", file);
        if(stat(*file, &attribut) == -1){
            fprintf(stderr, "Fehler bei stat\n");
            return EXIT_FAILURE;
        }
    
        //Prüfe ob übergebene file Datei oder Verzeichniss ist
        if((attribut.st_mode & S_IFMT) == S_IFREG){
            printf("Datei: %s\n", file);
        }else if((attribut.st_mode & S_IFMT) == S_IFDIR){
            printf("Verzeichniss: %s\n", file);
        }
    }
    
    int main(int argc, char* argv[]){
        DIR *dir;
        struct dirent *dirpointer;
        char punkt[] = ".";
        char punkte[] = "..";
    
        if(argc >= 2){
    	    //Öffnet übergebenes Verzeichniss
            if((dir=opendir(argv[1])) == NULL){
                fprintf(stderr, "Fehler bei opendir \n");
                return EXIT_FAILURE;
            }
    
            //Liest Verzeichniss in dir und übergibt es printFiles
            while((dirpointer=readdir(dir)) != NULL){
                if(strcmp((*dirpointer).d_name, punkt) != 0 && strcmp((*dirpointer).d_name, punkte) != 0){ 
                    printf("%s\n", (*dirpointer).d_name);
                    printFiles((*dirpointer).d_name);
                }
            }
    
            //Schließt dir 
            if(closedir(dir) == -1){
                printf("Fehler beim Schließen von %s\n", argv[1]);
            }   
        }
        return 0;
    }
    

  • Mod

    Da hat der Compiler ja auch vollkommen Recht. Vergleich mal die fragliche Zeile in dem hier gezeigten Code, mit dem Code, den du zuerst gezeigt hast.

    Siehe auch:
    http://www.c-plusplus.net/forum/304133
    Immer Copy&Paste bei Problemcode! Nicht abtippen!



  • Ok sehe meinen Fehler. Sorry. Dann wäre meine Frage warum funktioniert das hier nur bei Dateien und nicht bei Verzeichnissen?



  • Hab das Problem selber gefunden, aber danke für die Hilfe.


Anmelden zum Antworten