Seite 1 von 2

Liste in Dokument spiechern

Verfasst: Mo Mär 30, 2009 2:08 pm
von Empire
Ich hab diesen Kod:

Code: Alles auswählen

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


typedef struct Element        // Struktur für die Liste. Erklärung warum sie zwei Namen hat siehe unten.
{
  struct Element *next;      // Zeiger auf den nächsten Knoten
  char  Buchtitel[20];
  char  Autor[30];
  char  ISBNummer[15];
  char  Inhalt[500];
  char  Kommentar[100];                        // Zahl die in dem Knoten gespeichert wird.
} Knoten;

static char datei[]="Buchliste.txt";

int main ()
{
    FILE *fp;
  if((fp=fopen("LISTE.DAT","a+"))==NULL);

  int anz, i;
  Knoten *listen_kopf, *ptr_knoten, *help;                   // Kopf der Liste und 2 Hilfszeiger

  listen_kopf = NULL;  
                                 // Liste ist leer

  printf ("Anzahl: ");
  scanf ("%d", &anz);                                   // Eingabe der Anzahl

  printf ("\n\n");

  for (i = 0; i < anz; i++)                            // Erstellen von "anz"-Elementen
  {

    ptr_knoten = (Knoten *) malloc (sizeof(Knoten));        // Speicher für neues Element reservieren

    printf ("Buchtitel des %d. Buches: ", i + 1);
    scanf("%s", &ptr_knoten -> Buchtitel);
    printf ("Autor des %d. Buches: ", i + 1);
    scanf("%s", &ptr_knoten -> Autor);
    printf ("Die ISBNummer des %d. Buches: ", i + 1);
    scanf("%s", &ptr_knoten -> ISBNummer);
    printf ("Der Inhalt des %d. Buches: ", i + 1);
    scanf("%s", &ptr_knoten -> Inhalt);
    printf ("Kommentar zum %d. Buch: ", i + 1);
    scanf("%s", &ptr_knoten -> Kommentar);        // Wert für den Knoten einlesen

    ptr_knoten -> next = listen_kopf;                    // Knoten wird am Beginn eingefügt
    listen_kopf = ptr_knoten;                              // neuer Knoten ist der neue Listenkopf

  }


  printf ("\n\n");


  for (i = 0; i < anz; i++)                               // Ausgabe der Liste
  {

    printf ("Buch:\n%s\n\n", ptr_knoten -> Buchtitel);
    printf ("Autor:\n%s\n\n", ptr_knoten -> Autor);
    printf ("ISBnummer:\n%s\n\n", ptr_knoten -> ISBNummer);
    printf ("Inhalt:\n%s\n\n", ptr_knoten -> Inhalt);
    printf ("Kommentar:\n%s\n\n", ptr_knoten -> Kommentar);

    ptr_knoten = ptr_knoten -> next;                 // nächster Knoten

  }


  ptr_knoten = listen_kopf;                              // Pointer auf den Listenkopf setzen

  while (ptr_knoten != NULL)                             // Löschen der Liste; wenn der Pointer NULL ist, dann ist die Liste zu Ende
  {

    help = ptr_knoten -> next;                   // Adresse des nächsten Knotens speichern

    free (ptr_knoten);                               // Speicher freigeben

    ptr_knoten = help;                                 // dadurch bist du auf dem nächsten Knoten

  }

  printf ("\n");
  scanf ("%d");

  return 0;

}
Und will das diese ...................... Liste in dem ....................... Dokument abgespiechert wird-
Ich hab im Buch nachgelesen:
Aber das was da sthet funkt nur mit int Variablen.
Ich hab gegooglet:
Nichts verwertbares gefunden.
ich hab nen bekannten gefrag:
Der hatte keine ahnung.

Helft mir bitte mit dem .......... Ding ich hatte lezte nacht schon albträumen fon dem ding!!!!!!

mfg
Empire

Re: Liste in Dokument spiechern

Verfasst: Mo Mär 30, 2009 2:50 pm
von Dirty Oerti
Ähm...also in deinem Code fehlt das Speichern aber noch komplett, oder??
(Hatten wir das nicht schonmal...mit der Liste speichern und so?)

Wie dem auch sei:

Deine Liste hast du ja, oder? (Der Code da oben funktioniert?)
Diese Liste willst du nun speichern?

Naja, das ganze musst du natürlich in einer Schleife machen. Ich würde dazu doch gleich die Schleife nehmen, in der du die Elemente dann auch löschst.
Nur, bevor du die Elemente löschst musst du sie eben in die Datei schreiben.

Code: Alles auswählen

fwrite(ptr_knoten,sizeof(Knoten),1,fp);
Und das vor die Zeile, in der du den Knoten löschst.
Achja: Nicht vergessen, die Datei vorm Beenden des Programms zu schließen (rein aus "Anstand"^^)

MfG
Daniel

Re: Liste in Dokument spiechern

Verfasst: Mo Mär 30, 2009 3:03 pm
von Empire
achso ich habs immer mit putc () versucht
und dann hat der behauptet ich will aus char int machen

mfg
Empire

Re: Liste in Dokument spiechern

Verfasst: Mo Mär 30, 2009 3:10 pm
von Dirty Oerti
Du kannst es auch mit putc machen, allerdings musst du die Struktur dann INT für INT schreiben.
Wäre kein Problem, ist aber etwas mehr Aufwand und wozu gibt es schließlich fwrite.

Für die Zukunft: Bevor du einfach irgendeine Funktion verwendest und dich dann wunderst, warum es nicht klappt:
Schau einfach in einer Reference nach.
Bei google-Suche nach putc an erster Stelle:

http://www.cplusplus.com/reference/clib ... /putc.html
Writes a character to the stream and advances the position indicator.
Zu deutsch: Schreibt EIN (!!) Zeichen in den Stream und erhöht den Positionszähler. (o.ä.)
Von welchem Typ das Zeichen ist sagt dir die Deklaration:

Code: Alles auswählen

int putc ( int character, FILE * stream );
Ein INT. Was auch recht genau dein Problem wiederspiegelt.

MfG
Daniel :)

Re: Liste in Dokument spiechern

Verfasst: Mo Mär 30, 2009 3:21 pm
von Empire
So weit so gut jetzt sieht das ganze so aus :

Code: Alles auswählen

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


typedef struct Element        // Struktur für die Liste. Erklärung warum sie zwei Namen hat siehe unten.
{
  struct Element *next;      // Zeiger auf den nächsten Knoten
  char  Buchtitel[20];
  char  Autor[30];
  char  ISBNummer[15];
  char  Inhalt[500];
  char  Kommentar[100];                        // Zahl die in dem Knoten gespeichert wird.
} Knoten;

static char datei[]="Buchliste.txt";

int main ()
{
    FILE *fp;
  if((fp=fopen("LISTE.DAT","a+"))==NULL);

  int anz, i;
  Knoten *listen_kopf, *ptr_knoten, *help;                   // Kopf der Liste und 2 Hilfszeiger

  listen_kopf = NULL;
                                 // Liste ist leer

  printf ("Anzahl: ");
  scanf ("%d", &anz);                                   // Eingabe der Anzahl

  printf ("\n\n");

  for (i = 0; i < anz; i++)                            // Erstellen von "anz"-Elementen
  {

    ptr_knoten = (Knoten *) malloc (sizeof(Knoten));        // Speicher für neues Element reservieren

    printf ("Buchtitel des %d. Buches: ", i + 1);
    scanf("%s", &ptr_knoten -> Buchtitel);
    printf ("Autor des %d. Buches: ", i + 1);
    scanf("%s", &ptr_knoten -> Autor);
    printf ("Die ISBNummer des %d. Buches: ", i + 1);
    scanf("%s", &ptr_knoten -> ISBNummer);
    printf ("Der Inhalt des %d. Buches: ", i + 1);
    scanf("%s", &ptr_knoten -> Inhalt);
    printf ("Kommentar zum %d. Buch: ", i + 1);
    scanf("%s", &ptr_knoten -> Kommentar);        // Wert für den Knoten einlesen

    ptr_knoten -> next = listen_kopf;                    // Knoten wird am Beginn eingefügt
    listen_kopf = ptr_knoten;                              // neuer Knoten ist der neue Listenkopf

  }


  printf ("\n\n");


  for (i = 0; i < anz; i++)                               // Ausgabe der Liste
  {

    printf ("Buch:\n%s\n\n", ptr_knoten -> Buchtitel);
    printf ("Autor:\n%s\n\n", ptr_knoten -> Autor);
    printf ("ISBnummer:\n%s\n\n", ptr_knoten -> ISBNummer);
    printf ("Inhalt:\n%s\n\n", ptr_knoten -> Inhalt);
    printf ("Kommentar:\n%s\n\n", ptr_knoten -> Kommentar);

    ptr_knoten = ptr_knoten -> next;                 // nächster Knoten

  }


  ptr_knoten = listen_kopf;                              // Pointer auf den Listenkopf setzen

  while (ptr_knoten != NULL)                             // Löschen der Liste; wenn der Pointer NULL ist, dann ist die Liste zu Ende
  {
    fwrite(ptr_knoten,sizeof(Knoten),1,fp);

    help = ptr_knoten -> next;                   // Adresse des nächsten Knotens speichern

    free (ptr_knoten);                               // Speicher freigeben

    ptr_knoten = help;                                 // dadurch bist du auf dem nächsten Knoten

  }

  printf ("\n");
  scanf ("%d");

  while(fp!=NULL)
  {
      printf ("\n\n\n%s",fp -> Knoten -> Buchtitel);
      printf ("\n%s",fp -> Knoten.Autor);
      printf ("\n%s",fp -> Knoten -> ISBNummer);
      printf ("\n%s",fp -> Knoten -> Inhalt);
      printf ("\n%s",fp -> Knoten -> Kommentar);

      fp = fp ->next;
  }

  return 0;

}
Weil ich will ja am ende alles sehen und nicht nur das neuste eingegebene. aber dann das:

Code: Alles auswählen

r Programme\noch nen tets.c||In function `int main()':|
r Programme\noch nen tets.c|91|error: 'struct _iobuf' has no member named 'Knoten'|
r Programme\noch nen tets.c|92|error: 'struct _iobuf' has no member named 'Knoten'|
r Programme\noch nen tets.c|93|error: 'struct _iobuf' has no member named 'Knoten'|
r Programme\noch nen tets.c|94|error: 'struct _iobuf' has no member named 'Knoten'|
r Programme\noch nen tets.c|95|error: 'struct _iobuf' has no member named 'Knoten'|
r Programme\noch nen tets.c|97|error: 'struct _iobuf' has no member named 'next'|
||=== Build finished: 6 errors, 0 warnings ===|
Ich wes nicht was er will zu esrt dachte ich ich hätte mich verschrieben aber demn ist nicht so.
Was ist dann?

mfg
Empire

Re: Liste in Dokument spiechern

Verfasst: Mo Mär 30, 2009 3:23 pm
von Empire
@Dirty Oerti
Ich finde nur engliche seiten die zu gebrauen sind.
Und für mich ist das Fast das gleiche wie wenns japanish wäre.
In der schule komm ich in English auch nur durch die arbeiten will ich die beispiele kopier^^.

mfg
Empire

Re: Liste in Dokument spiechern

Verfasst: Mo Mär 30, 2009 3:26 pm
von Dirty Oerti
Welche Zeilen sind das?
Kopier mal nur die Zeilen 90-100 :)

Ohne Englisch kommt man nicht weit. Sieh es als gute Gelegenheit, es nebenbei zu lernen. Immer, wenn du nach etwas nachschlägst, lernst du ein Stück, verstehst du ein Wort nicht, dann geh auf leo.org.
Ums mal hart zu sagen: Sich hinzusetzen und zu jammern dass man etwas nicht kann bringt nichts. Lern Englisch, und du tust dir leichter.

MfG
Daniel :)

Re: Liste in Dokument spiechern

Verfasst: Mo Mär 30, 2009 3:45 pm
von Empire
@Dirty Oerti
Bist du im Rl eine Frau Falkenmayer und Unterichtest Englich an der RSB????
Weil genau das hat sie mal zu mir gesagt. Nur bei einer anderen gelegenheit^^.

Und jetzt eien Tosenden Aplaus für die Zeilen 90-100^^:

Code: Alles auswählen

  {
      printf ("\n\n\n%s",fp -> Knoten -> Buchtitel);
      printf ("\n%s",fp -> Knoten.Autor);
      printf ("\n%s",fp -> Knoten -> ISBNummer);
      printf ("\n%s",fp -> Knoten -> Inhalt);
      printf ("\n%s",fp -> Knoten -> Kommentar);

      fp = fp ->next;
  }

  return 0;
mfg
Empire

Re: Liste in Dokument spiechern

Verfasst: Mo Mär 30, 2009 3:50 pm
von Dirty Oerti
Äh, und wo stand das in deinem Code, den du zuerst gepostet hast?

So, überleg doch mal, was du da tust.
Du versuchst, in einem FILE-Objekt die Werte eines Eintrags "Knoten" zu ändern.
Das FILE-Objekt hat natürlich keinen Eintrag Knoten.

Du hast doch deine Struktur "Knoten".
Da hast du jetzt eine daraus erstellt, die heißt ptr_knoten. Mit der wird gearbeitet.
Nicht mit "fp", das ist deine Datei. Die hat beim Ausgaben doch nichts zu sagen...

Re: Liste in Dokument spiechern

Verfasst: Mo Mär 30, 2009 6:18 pm
von Empire
ich habs gemacht:

Code: Alles auswählen

  while(fp!=NULL)
  {
      printf ("\n\n\n%s",ptr_Knoten -> Buchtitel);
      printf ("\n%s",ptr_Knoten.Autor);
      printf ("\n%s",ptr_Knoten -> ISBNummer);
      printf ("\n%s",ptr_Knoten -> Inhalt);
      printf ("\n%s",ptr_Knoten -> Kommentar);
  }
jetzt behauteter es gibts net:

Code: Alles auswählen

r Programme\noch nen tets.c||In function `int main()':|
r Programme\noch nen tets.c|91|error: `ptr_Knoten' was not declared in this scope|
||=== Build finished: 1 errors, 0 warnings ===|
mfg
Empire