(In C) Dateipfad als Argument

Buba235

Erfahrenes Mitglied
Hallo!

Ich hab ja vorhin das mit den Argumenten gefragt und es hat mir auch echt gut geholfen. Jetzt wollte ich das ganze in der Praxis anwenden und prompt klappts nicht mehr. Es wird kompiliert und es läßt sich ausführen. Aber es gibt eine Speicherzugriffsverletzung ab dem Punkt wo die Datei geöffnet werden muss!

Code:
/*Includes*/
#include <stdio.h>
#include <mysql.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>


/*Defines*/
#define LINE_SIZE 4096


/*Prototypen*/
char* mystrtok(char*, char);
void writeInDatabase(MYSQL*);
int strings_ausgeben(char*, char**, size_t);


/*globale Variablen*/
extern int errno;


/*----------------------------------------------------------------------------*/
/*Hauptfunktion main startet das Programm*/
int main(int argc, char *argv[]) {

        /*Variablen*/
        int i;
        char *list[1024];

        /*Argumente pruefen*/
        for(i = 0; i < argc; i++) {
                /*Funktion aufrufen und Programm starten*/
                if (strings_ausgeben(argv[i], list, sizeof(list) / sizeof(char*)) >= 0) {
                        printf("%s\n", "Programmstart");
                }
        }
       
        return 0;
}/*Ende der Funktion main*/


/*----------------------------------------------------------------------------*/
/*Hier wird die Zeichenkette ermittelt, die spaeter auch in die Datenbank
  eingetragen werden soll (Zeile fuer Zeile)*/
int strings_ausgeben(char *parm, char **path, size_t path_size) {

        /*Variablen*/
        int i;
        FILE *super;
        FILE *datei;
        char *word = NULL;
        char gelesene_Kommas = ',';
        char buffer[LINE_SIZE];
        const char *pfadzuSuper;
        pfadzuSuper = "/home/tracer/wlan_DB/alert_files/super.txt";

        /*Datei anlegen*/
        super = fopen(pfadzuSuper, "wt");
        if (super == NULL) {
                perror("Fehler beim Oeffnen der Datei zum Schreiben(Funktion strings_ausgeben) ");
                errorHandler();
        }

        /*Datei zum Lesen oeffnen*/
        datei = fopen(path[1024], "rt");HIER klappts nicht mehr
        if (datei == NULL) {
                perror("Fehler beim Oeffnen der Datei zum Auslesen(Funktion strings_ausgeben) ");
                errorHandler();
        }

        for(i = 0; i < path_size; i++) {
                if (strcmp(parm, path[i]) == 0) {
                        /*Jede Zeile durchgehen und immer den String einlesen*/
                        while(fgets(buffer, LINE_SIZE, datei) != NULL) {
                                word = mystrtok(buffer, gelesene_Kommas);
                                for(i = 0; word != NULL; i++) {
                                        if (i == 12) {
                                                /*Das Eingelesene wird in die Datei
                                                 super.txt geschrieben*/
                                                fprintf(super, "%s\n", word);
                                                break;
                                        }
                                        word = mystrtok(NULL, gelesene_Kommas);
                                }
                        }
                }
        }

        /*Datei schliessen*/
        fclose(datei);
        fclose(super);
}/*Ende der Funktion datei_ausgeben*/


/*----------------------------------------------------------------------------*/
/*Diese Funktion uebernimmt die Aufgabe der C-eigenen Funktion strtok()
  Mit der C-eigenen Funktion wurden leere Teile zwischen den Kommas
  ueberlesen und der naechste Wert wurde ausgegeben. Diese Funktion
  arbeitet sauberer*/
char* mystrtok(char *s, char delim) {

        /*Variablen*/
        char *curr = NULL;
        char *ret = NULL;
        static char *buffer = NULL;

        if (s) {
                buffer = s;
        }

        curr = buffer;

        if (curr) {
                /*Einzelne Characters durchgehen solange bis Komma
                  oder ein \0 Zeichen*/
                while(*curr != delim && *curr != '\0') {
                        curr++;
                }

                if (*curr == '\0') {
                        return NULL;
                }

                *curr = '\0';
                ret = buffer;
                buffer = curr + 1;
        }

        return ret;
}/*Ende der Funktion mystrtok*/


Ich starte das Programm mit seinem Namen und dem Pfad zur Datei! Leider nimmt er den Pfad so nicht an. Aber wie soll ich dann sonst den Pfad so übergeben? Ich will es ja über die Argumente machen und nicht statisch im Code.
 
Zuletzt bearbeitet:
Hi.

Du deklarierst da ein Array von 1024 Strings namens list. Das belegst du aber nirgendwo mit Werten und übergibst es dann an den Parameter path der Funktion strings_ausgeben.

Wozu ist denn eigentlich dieses Array gut? Und warum greifst du in der Funktion strings_ausgeben dann auf das 1024. Element zu?

Gruß
 
Hallo!

Ich hab absoluten Müll gemacht, da hast du recht! Mittlerweile habe ich das ganze auch etwas verbessert:

Code:
/*Includes*/
#include <stdio.h>
#include <mysql.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>


/*Defines*/
#define LINE_SIZE 4096


/*Prototypen*/
char* mystrtok(char*, char);
void writeInDatabase(MYSQL*);
int strings_ausgeben(char*, char**, size_t);


/*globale Variablen*/
extern int errno;


/*----------------------------------------------------------------------------*/
/*Hauptfunktion main startet das Programm*/
int main(int argc, char *argv[]) {

        /*Variablen*/
        int i;
        char *path;

        /*Argumente pruefen*/
        for(i = 0; i < argc; i++) {
                /*Funktion aufrufen und Programm starten*/
                printf("%s\n", "Programmstart");
                path = argv[i + 1]
                printf("%s\n", path);
                strings_ausgeben(path);
        }
       
        return 0;
}/*Ende der Funktion main*/


/*----------------------------------------------------------------------------*/
/*Hier wird die Zeichenkette ermittelt, die spaeter auch in die Datenbank
  eingetragen werden soll (Zeile fuer Zeile)*/
void strings_ausgeben(char *path) {

        /*Variablen*/
        int i;
        FILE *super;
        FILE *datei;
        char *word = NULL;
        char gelesene_Kommas = ',';
        char buffer[LINE_SIZE];
        const char *pfadzuSuper;
        pfadzuSuper = "/home/tracer/wlan_DB/alert_files/super.txt";

        /*Datei anlegen*/
        super = fopen(pfadzuSuper, "wt");
        if (super == NULL) {
                perror("Fehler beim Oeffnen der Datei zum Schreiben(Funktion strings_ausgeben) ");
                errorHandler();
        }

        /*Datei zum Lesen oeffnen*/
        datei = fopen(path, "rt");HIER klappts nicht mehr
        if (datei == NULL) {
                perror("Fehler beim Oeffnen der Datei zum Auslesen(Funktion strings_ausgeben) ");
                errorHandler();
        }

       
              
                        /*Jede Zeile durchgehen und immer den String einlesen*/
                        while(fgets(buffer, LINE_SIZE, datei) != NULL) {
                                word = mystrtok(buffer, gelesene_Kommas);
                                for(i = 0; word != NULL; i++) {
                                        if (i == 12) {
                                                /*Das Eingelesene wird in die Datei
                                                 super.txt geschrieben*/
                                                fprintf(super, "%s\n", word);
                                                break;
                                        }
                                        word = mystrtok(NULL, gelesene_Kommas);
                                }
                        }

        /*Datei schliessen*/
        fclose(datei);
        fclose(super);
}/*Ende der Funktion datei_ausgeben*/


/*----------------------------------------------------------------------------*/
/*Diese Funktion uebernimmt die Aufgabe der C-eigenen Funktion strtok()
  Mit der C-eigenen Funktion wurden leere Teile zwischen den Kommas
  ueberlesen und der naechste Wert wurde ausgegeben. Diese Funktion
  arbeitet sauberer*/
char* mystrtok(char *s, char delim) {

        /*Variablen*/
        char *curr = NULL;
        char *ret = NULL;
        static char *buffer = NULL;

        if (s) {
                buffer = s;
        }

        curr = buffer;

        if (curr) {
                /*Einzelne Characters durchgehen solange bis Komma
                  oder ein \0 Zeichen*/
                while(*curr != delim && *curr != '\0') {
                        curr++;
                }

                if (*curr == '\0') {
                        return NULL;
                }

                *curr = '\0';
                ret = buffer;
                buffer = curr + 1;
        }

        return ret;
}/*Ende der Funktion mystrtok*/


So schaut meine "neue" Version aus. Wenn ich sie starte, dann wird am Anfang "Programmstart" und danach der Pfad zu der Datei, die ich öffnen will ausgegeben. Soweit alles klar, nur wenn ich diesen Pfad von der main an die Funktion strings_ausgeben übergebe, dann scheint er nicht richtig anzukommen. Was mach ich denn da falsch?
 
Hallo!


Ich habs mittlerweile selbst geschafft! Es funktioniert auch! mein fehler war, dass ich die Funktion mit in der Schleife aufgerufen habe. So ist es korrekt:

Code:
/*Includes*/
#include <stdio.h>
#include <mysql.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>


/*Defines*/
#define LINE_SIZE 4096


/*Prototypen*/
char* mystrtok(char*, char);
void writeInDatabase(MYSQL*);
int strings_ausgeben(char*, char**, size_t);


/*globale Variablen*/
extern int errno;


/*----------------------------------------------------------------------------*/
/*Hauptfunktion main startet das Programm*/
int main(int argc, char *argv[]) {

        /*Variablen*/
        int i;
        char *path;

        /*Argumente pruefen*/
        for(i = 0; i < argc; i++);
        path = argv[1];
        strings_ausgeben(path);
       
        return 0;
}/*Ende der Funktion main*/


/*----------------------------------------------------------------------------*/
/*Hier wird die Zeichenkette ermittelt, die spaeter auch in die Datenbank
  eingetragen werden soll (Zeile fuer Zeile)*/
void strings_ausgeben(char *path) {

        /*Variablen*/
        int i;
        FILE *super;
        FILE *datei;
        char *word = NULL;
        char gelesene_Kommas = ',';
        char buffer[LINE_SIZE];
        const char *pfadzuSuper;
        pfadzuSuper = "/home/tracer/wlan_DB/alert_files/super.txt";

        /*Datei anlegen*/
        super = fopen(pfadzuSuper, "wt");
        if (super == NULL) {
                perror("Fehler beim Oeffnen der Datei zum Schreiben(Funktion strings_ausgeben) ");
                errorHandler();
        }

        /*Datei zum Lesen oeffnen*/
        datei = fopen(path, "rt");HIER klappts nicht mehr
        if (datei == NULL) {
                perror("Fehler beim Oeffnen der Datei zum Auslesen(Funktion strings_ausgeben) ");
                errorHandler();
        }

       
              
                        /*Jede Zeile durchgehen und immer den String einlesen*/
                        while(fgets(buffer, LINE_SIZE, datei) != NULL) {
                                word = mystrtok(buffer, gelesene_Kommas);
                                for(i = 0; word != NULL; i++) {
                                        if (i == 12) {
                                                /*Das Eingelesene wird in die Datei
                                                 super.txt geschrieben*/
                                                fprintf(super, "%s\n", word);
                                                break;
                                        }
                                        word = mystrtok(NULL, gelesene_Kommas);
                                }
                        }

        /*Datei schliessen*/
        fclose(datei);
        fclose(super);
}/*Ende der Funktion datei_ausgeben*/


/*----------------------------------------------------------------------------*/
/*Diese Funktion uebernimmt die Aufgabe der C-eigenen Funktion strtok()
  Mit der C-eigenen Funktion wurden leere Teile zwischen den Kommas
  ueberlesen und der naechste Wert wurde ausgegeben. Diese Funktion
  arbeitet sauberer*/
char* mystrtok(char *s, char delim) {

        /*Variablen*/
        char *curr = NULL;
        char *ret = NULL;
        static char *buffer = NULL;

        if (s) {
                buffer = s;
        }

        curr = buffer;

        if (curr) {
                /*Einzelne Characters durchgehen solange bis Komma
                  oder ein \0 Zeichen*/
                while(*curr != delim && *curr != '\0') {
                        curr++;
                }

                if (*curr == '\0') {
                        return NULL;
                }

                *curr = '\0';
                ret = buffer;
                buffer = curr + 1;
        }

        return ret;
}/*Ende der Funktion mystrtok*/

Jetzt muss nur noch ne Fehlerabfrage hin und es passt vollends!
 

Neue Beiträge

Zurück