Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Probleme mit fwrite und Typumwandlung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.12.2007, 12:17 Uhr
mlc-hamster



Hallo,
ich hab folgendes Problem, ich soll für die FH ne Art Datenbank schreiben mit Nutzern einfügen auslesen usw.
Ich deklariere mir nun nen neuen Typ "Datensatz" und will den in eine Datei schreiben. Das Problem ist das mein Compiler folgendes ausgiebt:

bei der Funktion fwrite

Konvertierung des Parameters 1 von 'datensatz' in 'const void *' nicht moeglich

Hier mein Quelltext


C++:
void ausgabe(datensatz);
datensatz eingabe(int);




void main(void) {
    
    int n, i;
    datensatz student[100];

    printf("\nStudent erfassen\n\n");
    printf("Anzahl der Studenten? ");

    scanf("%d", &n);

    for (i=0; i<n; i++)
        student[i] = eingabe(i);

    for (i=0; i<n; i++)
        ausgabe(student[i]);

    

    //Datei öffnen
    fpt=fopen("student.txt", "w");
    
    //in Datei schreiben
    for (i=0; i<n; i++)
        fwrite( &student, sizeof(datensatz), 1, fpt); //hier der Fehler

        
    //Ausgabe Datensatz
    while (!feof(fpt)) {
        fread( &student, sizeof(datensatz), 1, fpt);
    
    }
    
    if ( (fpt=fopen("student.txt", "r")) == NULL  ) {
        printf("Datei nicht vorhanden");
        //return(0);
    }
    else {




    }
        
}


datensatz eingabe(int i) {

    datensatz student2;
        
    printf("\nName eingeben: ");
    fflush(stdin);
    scanf("%s", student2.name);

    printf("\nMatrikelnummer eingeben: ");
    fflush(stdin);
    scanf("%s", student2.matr_nr);

    printf("\nNote eingeben: ");
    fflush(stdin);
    scanf("%s", student2.note);

    return student2;
}



void ausgabe(datensatz student3) {

    printf("\nName: %s", student3.name);
    printf("\nMatrikelnummer: %s", student3.matr_nr);
    printf("\nNote: %s", student3.note);


}




Danke für eure Hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.12.2007, 12:21 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi,
structs so direkt in eine datei schreiben kann u.U gefährlich sein.

Besser wären da wohl


datensatz_put(const datensatz*, FILE*)
datensatz_get(datensatz*, FILE*)

funktionen, die die einzelnen member entsprechend schreiben bzw lesen.
--
class God : public ChuckNorris { };

Dieser Post wurde am 15.12.2007 um 12:22 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.12.2007, 12:46 Uhr
Nils



Probiere mal das ihr ist eigentlich für Adressen ist aber ja fast das Gleiche


C++:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// Definition einer Adresse
struct adresse
  {
   char name[50];
   char vorname[50];
   char Matrikelnummer[50];
   int Note;
   } ;

int n;                   // Anzahl der Adressen
struct adresse *adrs;    // Adressenatei
int BinSuche(char s[50])
  {
  int unten=0,oben=n,mitte;

  if (strcmp(s,adrs[unten].name)<=0)
      return 0;
    else
      {
      while(oben-unten>1)
        {
           mitte=(oben-unten)/2;
           if (strcmp(s,adrs[unten+mitte].name)==0)
             {
          unten+=mitte;
          oben=unten;
          }
           if (strcmp(s,adrs[unten+mitte].name)>0)
              unten+=mitte;
          else
           oben=unten+mitte;

           }
           if (strcmp(s,adrs[oben-1].name)==0)
             oben--;
      return oben;
      }
  }

// Vergleich zweier Adressen nach dem Namen
// für qsort
int vgl(const void* p1,const void* p2)
  {
  struct adresse* adr1,*adr2;
  adr1=(struct adresse*)p1;
  adr2=(struct adresse*)p2;
  return strcmp(adr1->name,adr2->name);
  }

// Einlesen einer Adresse ueber die Tastatur
struct adresse einlesen()
  {
  struct adresse adr;

  printf("\n");
  printf("Name    : ");
    scanf("%s",&(adr.name));
  printf("Vorname : ");
    scanf("%s",&(adr.vorname));
  printf("Matrikelnummer : ");
    scanf("%s",&(adr.Matrikelnummer));
  printf("Note     : ");
    scanf("%d",&(adr.Note));
  fflush(stdin);

  return adr;
  }

// Ausgeben einer Adresse auf den Bildschirm
void ausgeben(struct adresse adr)
  {
  printf("\nName    : %s",adr.name);
  printf("\nVorname : %s",adr.vorname);
  printf("\nMatrikelnummer : %s",adr.Matrikelnummer);
  printf("\nNote     : %d",adr.Note);
  }

// Abspeichern einer eingelesenen Adresse
// in einer Datei
void eingabe()
  {
  struct adresse adr;

  adr=einlesen();

  // falls die Datei nicht leer war
  if (n>0)
     {
     adrs=(struct adresse*)realloc(adrs,(n+1)*sizeof(adresse));
     adrs[n]=adr;
     }
   // falls die Datei leer war
   else
     adrs[0]=adr;

  n++;
  // Adressen neu sortieren
  qsort(adrs,n,sizeof (struct adresse), vgl);
  }

// Ausgabe der gesamten Datei
void ausgabe()
  {
  int k;

  if(n<=0)
      printf("Keine Name vorhanden\n");
    else
      for (k=0;k<n;k++)
        ausgeben(adrs[k]);
  }

// Suchen einer Adresse
void suchen()
  {
  char s[50];
  int k=0;

  printf("Name eingeben: ");
  scanf("%s",s);
  fflush(stdin);

  k = BinSuche(s);

  if (strcmp(adrs[k].name,s)==0)
     ausgeben( adrs[k]);
    else
    printf("Name %s nicht vorhanden\n",s);
  }

void loeschen()
  {
  int k=0;
  char s[50];

  printf("Name eingeben: ");
  scanf("%s",&s);
  k=BinSuche(s);

  if (strcmp(adrs[k].name,s)==0)
       {
      adrs[k]=adrs[n-1];
      n--;
      // Adressen neu sortieren
      qsort(adrs,n,sizeof (struct adresse), vgl);
      }
    else
      printf("Name %s nicht vorhanden\n",s);

  adrs=(struct adresse*)realloc(adrs,n*sizeof(struct adresse));
  }

// laden der Datei in das Feld adrs
void laden()
  {
  FILE* stream;

  stream=fopen("Adressen.dat","r");
  free(adrs);

  // falls das Laden funktioniert hat
  if (stream!=NULL)
      {
      // Anzahl der Adressen einlesen
        fread(&n,sizeof( int ),1,stream);

      // Speicher allokieren
        adrs=(struct adresse*)calloc(n,sizeof(struct adresse));

      // Adressen einlesen
      fread(adrs,sizeof(struct adresse),n,stream);

         fclose(stream);
      }
       // falls die Datei leer war
    else
         {
         printf("\nKeine Adressdatei gefunden!\n");
      printf("\nGeben Sie eine Adresse ein\n\n");
         n=0;
         adrs=(struct adresse*)calloc(1,sizeof(struct adresse));
         eingabe();
         }
  }

// speichern von adrs in der Datei
void speichern()
  {
  FILE* stream;
  int k;

  stream=fopen("Adressen.dat","w+");
  fwrite(&n,sizeof( int ),1,stream);

  for (k=0;k<=n-1;k++)
    {
    fwrite(&adrs[k],sizeof(struct adresse),1,stream);
    }

  fclose(stream);
  }

// Auswahl der Programmunterpunkte
int menue()
  {
  int a=0;
  char c[10];

  while (a<1 || a>7)
    {
    printf("\n/******   Menue   ******/\n\n");
    printf("1. Neue eingeben\n");
    printf("2. Suchen\n");
    printf("3. Liste\n");
    printf("4. Loeschen\n");
    printf("5. Laden\n");
    printf("6. Speichern\n");
    printf("7. Ende\n\n");

    printf("Ihre Eingabe : ");

    scanf("%s",&c);
    fflush(stdin);
    printf("\n");

    a=c[0]-48;
    }

  return a;
  }


void main()
  {
  int a;

  laden();

  do
    {
    a=menue();

    switch (a)
      {
      case 1: eingabe();break;
      case 2: suchen();break;
      case 3: ausgabe();break;
      case 4: loeschen();break;
      case 5: laden();break;
      case 6: speichern();break;
      }
    if (a==7)
      break;

    printf("\nweiter mit Eingabetaste\n");
    getchar();
    } while (1);

  speichern();
  free(adrs);
  }



Gruß

Nils

Dieser Post wurde am 15.12.2007 um 13:34 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.12.2007, 12:55 Uhr
mlc-hamster



Hab grade das hier gefunden:
www.galileocomputing.de/openbook/c_von_a_bis_z/c_018_016.htm#RxxobKap01801604002A261F02518C

Funzt ganz gut trotzdem Danke für Eure Hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: