Beschreiben von Dateien

Schnelle objektorientierte, kompilierende Programmiersprache.
FritziFoppel
Beiträge: 101
Registriert: Sa Mär 02, 2013 6:53 pm
Wohnort: Göppingen

Beschreiben von Dateien

Beitrag von FritziFoppel » Sa Mär 02, 2013 7:36 pm

Hi,

Ich hab mir zu Beginn des Jahres mal überlegt mit Programmieren zu beginnen. Also hab ich ein paar Tutorials durchforstet und bin gerade dabei ein paar kleinere Programme zu schreiben.

Zu meinem Problem: (es geht um eine "Tabelle")

1. Der Benutzer wird nach 5 Elementen gefragt, die als Tabellenheader dienen

2. Als nächsten Schritt, muss der Benutzer passende Werte zu den Elementen eintragen:

Beispiel:
Vorname Nachname Alter Adresse Wohnort
Max Mustermann 44 Strasse 1 München

(die Abstände sind hier einheitlich geregelt)

Die Datei wird jetzt beschrieben mit dem "Tabellenheader", darunter mit vielen Gleichstrichen und dann den Werten.
Bei den ersten Versuchen sind aber immer nur die ersten 4 Werte in die Datei geschrieben worden.

Ich hab das Problem "gelöst", indem ich am Ende einfach nochmal irgendetwas in die Datei geschrieben ( was dann nicht nicht hineingeschrieben wurde :D )

Meine Frage dazu: Habe ich vielleicht irgendetwas in meinem Programm vergessen, oder liegt der Fehler wo anderst?

Danke schon mal für ne Antwort.
Gruß Chris

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Beschreiben von Dateien

Beitrag von Bebu » Sa Mär 02, 2013 7:52 pm

Zeig uns doch bitte den Code, dann können wir dir mehr dazu sagen. Eventuell fehlt ein Newline bei dem letzten Eintrag für deine Tabelle und der letzte Eintrag bleibt im Puffer hängen. Ein bisschen Quellcode bitte ;)
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
darksider3
Beiträge: 347
Registriert: Fr Sep 14, 2012 6:26 pm
Wohnort: /dev/sda1
Kontaktdaten:

Re: Beschreiben von Dateien

Beitrag von darksider3 » Sa Mär 02, 2013 7:55 pm

Hey,
wie bebu schon sagte, wir können ohne Quellcode leider nichts ohne direkten Fehler machen^^
Ausserdem: Herzlich willkommen! ;)
effizienz ist, wenn ich ein loch bohre und hinterher mein nachbar auch ein bild aufhängen kann... ^^
Meine Homepage und der Microblog von mir :)
Live Life dont let Life Live You!
Am meisten Aktiv in Webentwicklung und PHP im Wiki

FritziFoppel
Beiträge: 101
Registriert: Sa Mär 02, 2013 6:53 pm
Wohnort: Göppingen

Re: Beschreiben von Dateien

Beitrag von FritziFoppel » Sa Mär 02, 2013 7:58 pm

Code: Alles auswählen

void TabellenHeader(struct Elemente *elemente, int k)
{
    printf("                    ----------------------------------------                    \n");

    printf("Erstes Element: ");
    fgets(elemente[k].element1, sizeof(elemente[k].element1), stdin);

    printf("Zweites Element: ");
    fgets(elemente[k].element2, sizeof(elemente[k].element2), stdin);

    printf("Drittes Element: ");
    fgets(elemente[k].element3, sizeof(elemente[k].element3), stdin);

    printf("Viertes Element: ");
    fgets(elemente[k].element4, sizeof(elemente[k].element4), stdin);

    printf("Fuenftes Element: ");
    fgets(elemente[k].element5, sizeof(elemente[k].element5), stdin);

    elemente[k].element1[strlen(elemente[k].element1)-1] = '\0';
    elemente[k].element2[strlen(elemente[k].element2)-1] = '\0';
    elemente[k].element3[strlen(elemente[k].element3)-1] = '\0';
    elemente[k].element4[strlen(elemente[k].element4)-1] = '\0';
    elemente[k].element5[strlen(elemente[k].element5)-1] = '\0';

    printf("\n                    ----------    Ihre Eingabe    ----------                    \n");
}

void TabellenHeaderSchreiben(struct Elemente *elemente, int k, FILE *file)
{
    int length = strlen(elemente[k].element5);
    int anzahl = length + 100;
    int j;
    char gleich [] = "=";
    char neuezeile [] = "\n";

    fseek(file, 0, SEEK_SET);
    fwrite(elemente[k].element1, sizeof(char), strlen(elemente[k].element1), file); //strlen(elemente[i].element1)
    fseek(file, 20, SEEK_SET);
    fwrite(elemente[k].element2, sizeof(char), strlen(elemente[k].element2), file);
    fseek(file, 40, SEEK_SET);
    fwrite(elemente[k].element3, sizeof(char), strlen(elemente[k].element3), file);
    fseek(file, 60, SEEK_SET);
    fwrite(elemente[k].element4, sizeof(char), strlen(elemente[k].element4), file);
    fseek(file, 80, SEEK_SET);
    fwrite(elemente[k].element5, sizeof(char), strlen(elemente[k].element5), file);

    fwrite(neuezeile, sizeof(char), 1, file);

    for(j = 1; j <= anzahl; j++)
    {
        fwrite(gleich, sizeof(char), strlen(gleich), file);
    }

    fwrite(neuezeile, sizeof(char), 1, file);

}

void ElementEingabe(struct EingabeElemente *person, int i, int k, struct Elemente *elemente)
{
    printf("%s: ", elemente[k].element1);
    fgets(person[i].element11, sizeof(person[i].element11), stdin);

    printf("%s: ", elemente[k].element2);
    fgets(person[i].element12, sizeof(person[i].element12), stdin);

    printf("%s: ", elemente[k].element3);
    fgets(person[i].element13, sizeof(person[i].element13), stdin);

    printf("%s: ", elemente[k].element4);
    fgets(person[i].element14, sizeof(person[i].element14), stdin);

    printf("%s: ", elemente[k].element5);
    fgets(person[i].element15, sizeof(person[i].element15), stdin);

    person[i].element11[strlen(person[i].element11)-1] = '\0';
    person[i].element12[strlen(person[i].element12)-1] = '\0';
    person[i].element13[strlen(person[i].element13)-1] = '\0';
    person[i].element14[strlen(person[i].element14)-1] = '\0';
    person[i].element15[strlen(person[i].element15)-1] = '\0';
}

void ElementSchreiben(struct EingabeElemente *person, int i, FILE *file)
{
    char neuezeile [] = "\n";
    int lengtha = 20 - strlen(person[i].element11);
    int lengthb = 20 - strlen(person[i].element12);
    int lengthc = 20 - strlen(person[i].element13);
    int lengthd = 20 - strlen(person[i].element14);
    int lengthe = 20 - strlen(person[i].element15);

    fseek(file, 0, SEEK_END);

    fwrite(neuezeile, sizeof(char), 1, file);

    fwrite(person[i].element11, sizeof(char), strlen(person[i].element11), file);
    fseek(file, lengtha, SEEK_CUR);
    fwrite(person[i].element12, sizeof(char), strlen(person[i].element12), file);
    fseek(file, lengthb, SEEK_CUR);
    fwrite(person[i].element13, sizeof(char), strlen(person[i].element13), file);
    fseek(file, lengthc, SEEK_CUR);
    fwrite(person[i].element14, sizeof(char), strlen(person[i].element14), file);
    fseek(file, lengthd, SEEK_CUR);
    fwrite(person[i].element15, sizeof(char), strlen(person[i].element15), file);

    fwrite(neuezeile, sizeof(char), 1, file);
    i++;

}
Soweit Die Funktionen. "ElementEingabe" und "ElementSchreiben" werden in "int main" von einer Zählschleife wiederholt.
Mag vielleicht ein wenig primitiv geschrieben sein. Davon abgesehen könnte man mir ja vielleicht n paar Verbesserungsvorschläge geben :D

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Beschreiben von Dateien

Beitrag von Bebu » Sa Mär 02, 2013 8:12 pm

Kannst du bitte das ganze Programm hier reinstellen, damit man selber damit rumspielen kann? Ohne jetzt genau gekuckt zu haben, könnte es genausogut ein Zählfehler in der Schleife sein. Stelle bitte den Code so ein, das wir ihn kompileren können.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

FritziFoppel
Beiträge: 101
Registriert: Sa Mär 02, 2013 6:53 pm
Wohnort: Göppingen

Re: Beschreiben von Dateien

Beitrag von FritziFoppel » Sa Mär 02, 2013 8:16 pm

Sorry dafür.

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Tastenpuffer()
{
    int c;
    while( ((c = getchar()) != -1) && (c != '\n') );
}

struct Elemente
{
    char element1 [64];
    char element2 [64];
    char element3 [64];
    char element4 [64];
    char element5 [64];
};

struct EingabeElemente
{
    char element11 [64];
    char element12 [64];
    char element13 [64];
    char element14 [64];
    char element15 [64];
};

void gleichSchreiben(int j, int k, struct Elemente *elemente, FILE *file)
{
    int length = strlen(elemente[k].element5);
    int anzahl = length + 100;
    char gleich [] = "=";
    char neuezeile [] = "\n";
    char programmende [] = "                    --------------Programmende--------------                    \n";

    fwrite(neuezeile, sizeof(char), 1, file);

    for(j = 1; j <= anzahl; j++)
    {
        fwrite(gleich, sizeof(char), strlen(gleich), file);
    }

    fwrite(programmende, sizeof(char), strlen(programmende), file);
    fwrite(neuezeile, sizeof(char), 1, file);
}

void TabellenHeader(struct Elemente *elemente, int k)
{
    printf("                    ----------------------------------------                    \n");

    printf("Erstes Element: ");
    fgets(elemente[k].element1, sizeof(elemente[k].element1), stdin);

    printf("Zweites Element: ");
    fgets(elemente[k].element2, sizeof(elemente[k].element2), stdin);

    printf("Drittes Element: ");
    fgets(elemente[k].element3, sizeof(elemente[k].element3), stdin);

    printf("Viertes Element: ");
    fgets(elemente[k].element4, sizeof(elemente[k].element4), stdin);

    printf("Fuenftes Element: ");
    fgets(elemente[k].element5, sizeof(elemente[k].element5), stdin);

    elemente[k].element1[strlen(elemente[k].element1)-1] = '\0';
    elemente[k].element2[strlen(elemente[k].element2)-1] = '\0';
    elemente[k].element3[strlen(elemente[k].element3)-1] = '\0';
    elemente[k].element4[strlen(elemente[k].element4)-1] = '\0';
    elemente[k].element5[strlen(elemente[k].element5)-1] = '\0';

    printf("\n                    ----------    Ihre Eingabe    ----------                    \n");
}

void TabellenHeaderSchreiben(struct Elemente *elemente, int k, FILE *file)
{
    int length = strlen(elemente[k].element5);
    int anzahl = length + 100;
    int j;
    char gleich [] = "=";
    char neuezeile [] = "\n";

    fseek(file, 0, SEEK_SET);
    fwrite(elemente[k].element1, sizeof(char), strlen(elemente[k].element1), file); //strlen(elemente[i].element1)
    fseek(file, 20, SEEK_SET);
    fwrite(elemente[k].element2, sizeof(char), strlen(elemente[k].element2), file);
    fseek(file, 40, SEEK_SET);
    fwrite(elemente[k].element3, sizeof(char), strlen(elemente[k].element3), file);
    fseek(file, 60, SEEK_SET);
    fwrite(elemente[k].element4, sizeof(char), strlen(elemente[k].element4), file);
    fseek(file, 80, SEEK_SET);
    fwrite(elemente[k].element5, sizeof(char), strlen(elemente[k].element5), file);

    fwrite(neuezeile, sizeof(char), 1, file);

    for(j = 1; j <= anzahl; j++)
    {
        fwrite(gleich, sizeof(char), strlen(gleich), file);
    }

    fwrite(neuezeile, sizeof(char), 1, file);

}

void ElementEingabe(struct EingabeElemente *person, int i, int k, struct Elemente *elemente)
{
    printf("%s: ", elemente[k].element1);
    fgets(person[i].element11, sizeof(person[i].element11), stdin);

    printf("%s: ", elemente[k].element2);
    fgets(person[i].element12, sizeof(person[i].element12), stdin);

    printf("%s: ", elemente[k].element3);
    fgets(person[i].element13, sizeof(person[i].element13), stdin);

    printf("%s: ", elemente[k].element4);
    fgets(person[i].element14, sizeof(person[i].element14), stdin);

    printf("%s: ", elemente[k].element5);
    fgets(person[i].element15, sizeof(person[i].element15), stdin);

    person[i].element11[strlen(person[i].element11)-1] = '\0';
    person[i].element12[strlen(person[i].element12)-1] = '\0';
    person[i].element13[strlen(person[i].element13)-1] = '\0';
    person[i].element14[strlen(person[i].element14)-1] = '\0';
    person[i].element15[strlen(person[i].element15)-1] = '\0';
}

void ElementSchreiben(struct EingabeElemente *person, int i, FILE *file)
{
    char neuezeile [] = "\n";
    int lengtha = 20 - strlen(person[i].element11);
    int lengthb = 20 - strlen(person[i].element12);
    int lengthc = 20 - strlen(person[i].element13);
    int lengthd = 20 - strlen(person[i].element14);
    int lengthe = 20 - strlen(person[i].element15);

    fseek(file, 0, SEEK_END);

    fwrite(neuezeile, sizeof(char), 1, file);

    fwrite(person[i].element11, sizeof(char), strlen(person[i].element11), file);
    fseek(file, lengtha, SEEK_CUR);
    fwrite(person[i].element12, sizeof(char), strlen(person[i].element12), file);
    fseek(file, lengthb, SEEK_CUR);
    fwrite(person[i].element13, sizeof(char), strlen(person[i].element13), file);
    fseek(file, lengthc, SEEK_CUR);
    fwrite(person[i].element14, sizeof(char), strlen(person[i].element14), file);
    fseek(file, lengthd, SEEK_CUR);
    fwrite(person[i].element15, sizeof(char), strlen(person[i].element15), file);

    fwrite(neuezeile, sizeof(char), 1, file);
    i++;

}

int main()
{
    struct Elemente elemente[1];
    struct EingabeElemente person[5];
    FILE *file = fopen("Elementetabelle.txt", "w");

    int i = 0, j = 0, k = 0, eingabe = 0;

    printf("================================================================================");
    printf("                              = Willkommen =                                    ");
    printf("================================================================================\n");
    printf("Dieses Programm fragt nach mehreren Elementen, die sie selbst bestimmen koennen\n(max.5).\nDasProgramm listet diese Elemente in einer Tabelle auf.\n");
    printf("Anschliessend koennen sie Werte in die Tabelle eintragen und dann bearbeiten\nDie Tabelle wird unter dem Namen Elementetabelle.txt abgespeichert.\n");
    printf("\n================================================================================");
    printf("Dieses Programmfenster erkennt keine Sonderzeichen.\nBitte beschraenken sie sich hier auf ss, ae, oe, ue ...\n");
    printf("================================================================================");

    printf("\nSie werden nun nach 5 Elementen gefragt.\nWenn sie weniger benoetigen unterbrechen sie die Eingabeaufforderung mit '0'.\n");
    printf("\n");

    TabellenHeader(&elemente[k], k);

    while(1)
    {
        printf("================================================================================");
        printf("\nSind sie mit der Eingabe zufrieden, oder wollen sie etwas verbessern?\n\n");
        printf("Waehlen sie bitte aus:\nBestaetigen: 1\nVerbessern: 2\n");
        scanf("%d", &eingabe);
        printf("================================================================================");
        Tastenpuffer();

        if(eingabe == 2)
        {
            TabellenHeader(&elemente[k], k);
        }

        else if(eingabe == 1)
        {
            TabellenHeaderSchreiben(&elemente[k], k, file);

            printf("Ihre 5 Elemente wurden in die Datei geschrieben,\nnun koennen sie den Elementen Werte zuweisen.\nSie werden nun nach 10 Wertepaketen abgefragt.\n");
            printf("Achten sie dabei auf das Geschriebene, da dieser Vorgang nicht wiederholt wird.\n\n");

            for(j = 0; j <= 4; j++)
            {
                ElementEingabe(&person[i], i, k, &elemente[k]);
                printf("\n");
                ElementSchreiben(&person[i], i, file);
            }

            gleichSchreiben(j, k, &elemente[k], file);

            printf("                    --------------Programmende--------------                    \n");
            return 0;
        }
    }
    fclose(file);
}


Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Beschreiben von Dateien

Beitrag von Bebu » So Mär 03, 2013 8:33 am

Also, ich habe den Fehler noch nicht gefunden, aber ein paar Tipps habe ich für dich: Kein absichlichen Endlosschleifen einbauen

Code: Alles auswählen

while(1)
So was solltest du bleiben lassen. Du hast sehr viel gleichen Code, wo sich höchstens die Daten ändern, lagere das in Funktionen aus. Wenn du den Fehler suchst, nimm alles unnötige aus dem Programm und suche so den Punkt, wo der Fehler auftritt.

Lg Bebu
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

FritziFoppel
Beiträge: 101
Registriert: Sa Mär 02, 2013 6:53 pm
Wohnort: Göppingen

Re: Beschreiben von Dateien

Beitrag von FritziFoppel » So Mär 03, 2013 12:52 pm

Danke für die Antwort.

Wenn ich schon mal dabei bin:
Hab ich meinen Code vielleicht ein wenig zu aufwendig geschrieben?
Gibt es vielleicht eine Möglichkeit die Funktionen, die die Datei beschreiben kürzer zu gestalten?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Beschreiben von Dateien

Beitrag von Xin » So Mär 03, 2013 1:39 pm

FritziFoppel hat geschrieben:Hab ich meinen Code vielleicht ein wenig zu aufwendig geschrieben?
Lass es mich so sagen, der Code sagt mir, dass Du Dich seit einigen Wochen (3-6?) mit C beschäftigst.
Der Code ist Käse. Das heißt aktuell ist er junger Gouda: Geschmacklos und glitschig.
Lass ihn mal 18 Monate reifen, kleine Salzkristalle funkeln als Highlights und geschmacklich ist er ein Genuß, den man eigentlich gar nicht mit schnödem Brot verschandeln möchte. ;-)
FritziFoppel hat geschrieben:Gibt es vielleicht eine Möglichkeit die Funktionen, die die Datei beschreiben kürzer zu gestalten?
Natürlich: Schau Dir Deinen Code an: Du findest schon rein optisch immer wieder ähnliche Textstellen. Hier bieten sich Schleifen und Arrays an.


Keine Sorge, das sind Erfahrungswerte, die kommen werden. Am Anfang sieht das immer so aus, weil man Änderungen eben von Hand beschreibt, statt einen Schritt zurück zu gehen und die Handlung zu beschreiben, die die Änderung hervorruft. Schau Dir das den Aufruf von Seek an: erst gehst Du auf 0, dann auf 20, dann auf 40, dann auf 60... Diese Änderung kannst Du beschreiben, in dem Du bei 0 beginnst und dann immer 20 weiter gehst...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Beschreiben von Dateien

Beitrag von Bebu » Do Mär 07, 2013 7:46 pm

Konntest du dein Problem mittlerweile lösen?
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Antworten