PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : lifo-stack problem in c beim dateischreiben



manny
18-05-2003, 13:38
hallo zusammen. ich hab hier ein kleinen c-programm das nicht richtig arbeitet. es geht um doppeltverkettete listen. (lifo-stack)

ein uni-prof soll studenten zu klausuren anmelden.
bitte nicht über sinn und unsinn dieses programms philosophieren. es ist eine übungsaufgabe.

also:
main (); funzt !
anmelde (); funzt !
zeige (); funzt !
schreibe (); funzt nicht.

mein problem ist diese zeile:

fprintf (fp, "%d %d %s\n", (zeiger->matrikel), (zeiger->telefon), (zeiger->email));

das programm compiliert, aber wenn ich beim ausführen in diese zeile komme, bekomme ich eine "Fault-Access"-Fehlermeldung und das programm stürzt ab.

lasse ich zeiger->email weg, also:
fprintf (fp, "%d %d\n", (zeiger->matrikel), (zeiger->telefon));

läuft es zwar ohne absturz, aber dann steht in zeiger->telefon eine falsche information :(

bitte helfen =)



#include <stdio.h>
#include <stdlib.h>
#include <conio.h> // Borland C suxx
#include <string.h>

// Datenstruktur
typedef struct listElem {
double matrikel;
double telefon;
char email[30];
struct listElem *next;
struct listElem *prev;
} t_listElem;


// Es ist nur eine Liste vorhanden
t_listElem *anfang, *ende;


// Prototypen
void init ();
void lade ();
void schreibe ();
void anmelde ();
void abmelde ();
void zeige ();



void main ()
{
init ();

int eingabe;

clrscr ();
printf ("Autor: Clemens Kalbfuss SS03 Prog2-Praktikum Aufgabe 9\n");
printf ("LIFO-Stack doppeltverkettet\n\n");

printf ("\nHAUPTMENU\n1. Lade Daten\n2. Anmelden\n3. Zeige Liste\n4. Abmelden\n5. Speichere Daten\n0. Ende\n");
scanf ("%d",&eingabe);

while (eingabe)
{
switch (eingabe) {
case 1: break;
case 2: anmelde ();
break;
case 3: zeige ();
break;
case 4: break;
case 5: schreibe ();
break;
case 0: break;
default: printf ("\nFehler bei der Auswahl.\n");
printf ("\n\nPress any key to exit...");
getch ();
break;
} // end of switch


clrscr ();
printf ("Autor: Clemens Kalbfuss SS03 Prog2-Praktikum Aufgabe 9\n");
printf ("LIFO-Stack doppeltverkettet\n\n");

printf ("\nHAUPTMENU\n1. Lade Daten\n2. Anmelden\n3. Zeige Liste\n4. Abmelden\n5. Speichere Daten\n0. Ende\n");
scanf ("%d",&eingabe);
}

printf ("\n\nPress any key to exit...");
getch ();
} // end of main ()



void init ()
{
anfang = NULL;
ende = NULL;
}


void schreibe ()
{
FILE *fp;
char dateiname[20];
t_listElem *zeiger = anfang;

printf ("In welche Datei speichern ? ");
scanf ("%s", dateiname);

if ((fp = fopen (dateiname, "w")) != NULL)
{
if (anfang == NULL)
{
fprintf (fp, "Keine Anmeldungen");
} else
while (zeiger != NULL)
{
fprintf (fp, "%d %d %s\n", (zeiger->matrikel), (zeiger->telefon), (zeiger->email));
zeiger = zeiger->next;
}
} else
printf ("\nFehler beim Oeffnen der Datei !");
fclose (fp);
} // end of schreibe



void anmelde ()
{
double matrikel, telefon;
char email[30];
t_listElem *neu;
neu = (t_listElem *) malloc (sizeof(t_listElem));

if (neu != NULL)
{
printf ("Geben Sie ihre Matrikelnummer an: ");
scanf ("%d", &matrikel);
printf ("Geben Sie ihre Telefonnummer an: ");
scanf ("%d", &telefon);
printf ("Geben Sie ihre E-Mail an: ");
scanf ("%s", email);

neu->matrikel = matrikel;
neu->telefon = telefon;
strcpy (neu->email, email);
neu->prev = NULL;
neu->next = NULL;

if (anfang == NULL)
{
anfang = neu;
ende = neu;
} else
{
ende->next = neu;
neu->prev = ende;
ende = neu;
}


} else printf ("Fehler in anmelde() bei malloc");

} // end of anmelde





void zeige ()
{
t_listElem *zeiger = anfang;

if (anfang == NULL)
{
printf ("\nKeine Eintraege vorhanden !\n");
} else
{
printf ("Angemeldete Studenten:\n");
while (zeiger != NULL)
{
printf ("\nMatrikelnummer: %d\n", zeiger->matrikel);
printf ("Telefonnummer: %d\n", zeiger->telefon);
printf ("E-Mail: %s\n", zeiger->email);
zeiger = zeiger->next;
}

}
printf ("\n\nPress any key to continue...");
getch ();

} // end of zeige ();

anda_skoa
18-05-2003, 14:02
Hmm, vielleicht fehlt der terminierende \0 character im email String.
Könnte zB passieren, wenn man eine zulange email Adresse eingibt.

Bitte ändere deinen Beitrag so, dass statt der quote tags code tags verwendet werden und die Einrückung halbwegs vernünftig ist.

Ciao,
_
P.S. int main() nicht void main()

manny
18-05-2003, 14:12
hmm, glaube ich weniger, denn in zeige (); gibt es eine korekte textausgabe.
printf ("E-Mail: %s\n", zeiger->email);

während ich in schreibe(); diesen Access-Fehler bekomme:
fprintf (fp, "%d %d %s\n", (zeiger->matrikel), (zeiger->telefon), (zeiger->email));

anda_skoa
18-05-2003, 15:50
Da hast du recht.

Lass mal die Klammer weg, die hast du beim printf in zeige() nicht.

int main :D

Ciao,
_

dakjo
18-05-2003, 16:16
Sind die Klammern nicht Casts ?

pik7
18-05-2003, 16:33
hallo,

ich wieß zwar nicht wie die Borland Jungens das handhaben aber ist
das hier richtig?

typedef struct listElem {
double matrikel;
double telefon;
char email[30];
struct listElem *next;
struct listElem *prev;
} t_listElem;

und dann mit %d in

fprintf (fp, "%d %d %s\n", (zeiger->matrikel), (zeiger->telefon), (zeiger->email));

hantieren??

Benutzt man da nicht %f?

Hab mir mal die Mühe gemacht den Code durch den gcc zu orgeln
und hatte segfault an der gleichen Stelle.

Mit %f oder int statt double funktionierte das auf einmal.

gruß

anda_skoa
18-05-2003, 16:50
Ist mir gar nicht aufgefallen.

Double für Fixkomma Werte ist natürlich Unfug.

Ciao,
_

manny
18-05-2003, 16:57
LoL,

stimmt. das wars ;)
typisch, immer wieder passieren mir solche lapalien :D

naja, ein danke schön an alle.

c-ya