Seite 1 von 2

Beschreiben von Dateien

Verfasst: Sa Mär 02, 2013 7:36 pm
von FritziFoppel
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

Re: Beschreiben von Dateien

Verfasst: Sa Mär 02, 2013 7:52 pm
von Bebu
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 ;)

Re: Beschreiben von Dateien

Verfasst: Sa Mär 02, 2013 7:55 pm
von darksider3
Hey,
wie bebu schon sagte, wir können ohne Quellcode leider nichts ohne direkten Fehler machen^^
Ausserdem: Herzlich willkommen! ;)

Re: Beschreiben von Dateien

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

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

Re: Beschreiben von Dateien

Verfasst: Sa Mär 02, 2013 8:12 pm
von Bebu
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.

Re: Beschreiben von Dateien

Verfasst: Sa Mär 02, 2013 8:16 pm
von FritziFoppel
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);
}


Re: Beschreiben von Dateien

Verfasst: So Mär 03, 2013 8:33 am
von Bebu
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

Re: Beschreiben von Dateien

Verfasst: So Mär 03, 2013 12:52 pm
von FritziFoppel
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?

Re: Beschreiben von Dateien

Verfasst: So Mär 03, 2013 1:39 pm
von Xin
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...

Re: Beschreiben von Dateien

Verfasst: Do Mär 07, 2013 7:46 pm
von Bebu
Konntest du dein Problem mittlerweile lösen?