[C/C++] Erweiterung eines C Programms

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Smokers, 28. Juni 2010 .

  1. 28. Juni 2010
    Erweiterung eines C Programms

    Also das vorhandene Programm (siehe unten) soll erweitert werden.
    Es soll in einer weitere Textdatei die richtige alphabetische Reihenfolge der Datensätze ablegen. (Position oder ByteNr) [-> nach Name sortieren]
    Sprich es sollen weiterhin die Datensätze eifnach in die Datei geschrieben werden, jedoch in einer weiteren Textdatei die Datensatznummern, sodass eine sortierte Ausgabe erfolgen kann.

    Meine Idee wäre halt gewesen einfach nen zweites Array mit den Namen und den ursprünglichen Positionen zu erstellen, und dieses Array dann nach den Namen zu sortieren.
    Das Problem ist ja das es unter C keine assoziativen Arrays gibt, das hätte die ganze Sache sehr erleichtert. Ne Idee wie ich das umsetzen kann?!

    Ich bin mir sicher ich würde auch ne Idee finden, jedoch hoffe ich auf einen schnellen einfachen Ansatz da ich Morgen und Mittwoch schon jeweils ne Prüfungen schreibe und das MIttwoch abgeben soll, daher hab ich eigentlich anderes zu tun als das noch zu lösen.
    Leider aber Pflicht.

    Daher bitte ich einfach um ein wenig Hilfe, bzw Denk-Abnahme ^^°°

    Bitte um Verständnis,

    danke =)



    Code:
    /*
     * File: main.c
     * Author: Smoki
     *
     * Created on 08. June 2010, 22.45
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    /*
     *
     */
    #if defined(_WIN32) || defined(_WIN64)
    
    void clear_screen() {
     system("cls");
    }
    #else
    
    void clear_screen() {
     system("clear");
    }
    #endif
    
    struct satz {
     char name[30];
     char vorname[20];
     char adresse[50];
    };
    void readFileName(char*);
    void printDataSet(unsigned int, char*);
    void writeNewDataToPosition(int, char*);
    void cleanCharArray(char*);
    void readDataSheet(char*,char*,int);
    
    int main(int argc, char** argv) {
     FILE *fp;
     char *fname;
     char key = '\0';
    
     if (argc > 1) {
     fname = argv[1];
     } else {
     fname = (char *) malloc(sizeof (char) * 61);
     fname[60] = '\0';
     readFileName(fname);
     }
    
    
     printf("Gewaehlte Datei ist : \"%s\".\n\n", fname);
     while (!file_exists(fname)) {
     while (key != '1' && key != '2') {
     printf("Die Datei existiert nicht. Waehlen Sie bitte die Vorgehensweise:\n");
     printf("\n");
     printf("(1) Dateinamen aendern\n");
     printf("(2) Datei erstellen\n");
     fflush(stdin);
     key = getchar();
     fflush(stdin);
     }
     if (key == '1') {
     readFileName(fname);
     }
     if (key == '2') {
     fp = fopen(fname, "a+");
     if (fp) {
     printf("Datei wurde erfolgreich angelegt...\n\n");
     } else {
     printf("Fehler beim erstellen der Datei. Erneuter Versuch!");
     fname[0] = '\0';
     }
     fclose(fp);
     }
     key = '\0';
     }
    
     fflush(stdin);
     clear_screen();
     do {
     while (key != '1' && key != '2' && key != '3' && key != '4' && key != '0') {
     clear_screen();
     printf("Sie arbeiten mit Datei \"%s\".\n", fname);
     printf("Waehlen Sie Ihre naechste Operation...\n\n");
     printf("(1) Neuen Datensaetze eingeben\n");
     printf("(2) Datensatz bearbeiten \n");
     printf("(3) Ausgabe aller Datensaetze aus \"%s\"\n", fname);
     printf("(4) Ausgabe eines speziellen Datensatzes aus \"%s\"\n", fname);
     printf("(0) Beenden\n");
     fflush(stdin);
     key = getchar();
     fflush(stdin);
     }
     if (key == '1') {
     writeNewDataToPosition(0, fname);
    
     }
     if (key == '2') {
     int pos = 0;
     while (pos < 1 || pos > 100) {
     printf(">Position(1-100) : ");
     fflush(stdin);
     scanf("%d", &pos);
     fflush(stdin);
     }
     writeNewDataToPosition(pos, fname);
     }
     if (key == '3') {
     printDataSet(0, fname);
     }
     if (key == '4') {
     int pos = 0;
     while (pos < 1 || pos > 100) {
     printf(">Position(1-100) : ");
     fflush(stdin);
     scanf("%d", &pos);
     fflush(stdin);
     }
     clear_screen();
     printDataSet(pos, fname);
     printf("\n");
     }
     if (key == '0') {
     return 1;
     }
     while (key != 'n' && key != 'j') {
     printf("Moechten Sie eine weitere Operation durchfuehren?(j/n)\n");
     key = getchar();
     fflush(stdin);
     }
     } while (key != 'n');
    }
    
    void writeNewDataToPosition(int pos, char* fname) {
     FILE *fp;
     fp = fopen(fname, "r+b");
     struct satz data;
     memset(&data, 0, sizeof(data));
     if (pos == 0) {
     fseek(fp, 0, SEEK_END);
     struct satz data;
     readDataSheet(data.name,"Bitte geben Sie den Namen an!",sizeof(data.name));
     readDataSheet(data.vorname,"Bitte geben Sie den Vornamen an!",sizeof(data.vorname));
     readDataSheet(data.adresse,"Bitte geben Sie die Adresse an!",sizeof(data.adresse));
     fwrite(&data, sizeof (struct satz), 1, fp);
    
     } else {
     struct satz newdata;
     memset(&newdata, 0, sizeof(newdata));
     fseek(fp, ((pos - 1) * sizeof (struct satz)), SEEK_SET);
     fread(&data, sizeof (struct satz), 1, fp);
     clear_screen();
     printf("Alter Datensatz:\"%s\"\n",data.name);
     readDataSheet(newdata.name,"Bitte geben Sie den neuen Namen an!",sizeof(newdata.name));
     printf("Alter Datensatz:\"%s\"\n",data.vorname);
     readDataSheet(newdata.vorname,"Bitte geben Sie den neuen Vornamen an!",sizeof(newdata.vorname));
     printf("Alter Datensatz:\"%s\"\n",data.adresse);
     readDataSheet(newdata.adresse,"Bitte geben Sie die neue Adresse an!",sizeof(newdata.adresse));
     if(strlen(newdata.name)>0){
     strcpy(data.name,newdata.name);
     }
     if(strlen(newdata.vorname)>0){
     strcpy(data.vorname,newdata.vorname);
     }
     if(strlen(newdata.adresse)>0){
     strcpy(data.adresse,newdata.adresse);
     }
     fseek(fp, ((pos - 1) * sizeof (struct satz)), SEEK_SET);
     fwrite(&data, sizeof (struct satz), 1, fp);
     }
     fclose(fp);
    }
    
    void printDataSet(unsigned int pos, char* fname) {
     struct satz data;
     memset(&data, 0, sizeof(data));
     FILE *fp;
     fp = fopen(fname, "r");
     int i = 1;
     if (pos > 0) {
     fseek(fp, ((pos - 1) * sizeof (struct satz)), SEEK_SET);
     i = pos;
     }
     while (fread(&data, sizeof (struct satz), 1, fp) > 0 && (i == pos || pos == 0)) {
     printf("Datensatz %d: \n", i);
     printf("\t Name: %s\n", data.name);
     printf("\t Vorname: %s\n", data.vorname);
     printf("\t Adresse: %s\n", data.adresse);
     printf("\n");
     i++;
     }
     fclose(fp);
    }
    
    void readFileName(char* fname) {
     do {
     printf("Bitte geben Sie den Dateinamen ein!\n");
     scanf("%s60", fname);
     } while (strlen(fname) < 1);
     fflush(stdin);
    }
    
    int file_exists(char *file_name) {
     FILE *fp;
     if (fp = fopen(file_name, "r")) {
     fclose(fp);
     return 1;
     } else {
     return 0;
     }
    }
    
    void cleanCharArray(char *str) {
     size_t p = strlen(str);
     str[p - 1] = '\0';
    }
    void readDataSheet(char* dest,char* ask,int length){
     fflush(stdin);
     printf("%s\n",ask);
     fgets(dest,length , stdin);
     cleanCharArray(dest);
     fflush(stdin);
     clear_screen();
    }
     
  2. 28. Juni 2010
    AW: Erweiterung eines C Programms

    ich versteh das nicht so richtig glaub ich

    sollen in der 2. textdatei nur die indizes des ursprünglichen arrays lexikographisch nach name sortiert stehen?

    dann könntest du wie du schon meintest ein 2. array machen mit ner weiteren variablen im datensatz, also dem index im unsortierten array, das array lexikographisch nach namen sortieren (mit bubblesort oder so) und die werte der indexvariablen in die datei schreiben.

    zum ausgeben die indizes aus der datei in ein array einlesen und die entsprechenden datensätze ausgeben.

    ich hoffe ich habe da keinen denk- oder verständnisfehler drin, wenn doch einfach ignorieren^^
     
  3. 29. Juni 2010
    AW: Erweiterung eines C Programms

    Nein das ist schon richtig so.
    Die im Datensatz beinhalteten Namen sind zu ordnen und deren Indizies in die 2te Textdatei in der Reihenfolge zu speichern sodass ein sortiertes ausgeben der Originaltextdatei möglich ist.

    Mein Problem ist , wie mach ich nen assoziatives Array?! das geht ja soweit nicht, geht es wirklich nur mittels 2 arrays die einmal den Namen und einmal die Position enthalten?!
     
  4. 29. Juni 2010
    AW: Erweiterung eines C Programms

    Hey!

    Du kannst ja ein neues "struct" deklarieren (mit z.B. membern "satz", "index") , das dann die benoetigten Informationen haelt. Davon erstellst du dir dann ein Array, mit dem du arbeitest.
    Dann machst du dir eine Funktion z.B.
    Code:
    int write_data_and_index(DeinStruktTyp *data, FILE *df, FILE *if);
    , die in df den satz schreibt und in if den index. Das Sortieren kannst du gleich beim Erstellen der Struktur erledigen, wenn es nicht noetig ist (ich verstehe auch nicht ganz auf was du hinauswillst).

    Mfg,

    Kolazomai
     
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.