Anzeige

Daten aus einem Datei einlesen und in einem struct speichern

#1
HALLO !
kann mir vlt jmd dabei helfen den Fehler in diesem Program zu erkennen?


C++:
#include<stdio.h>
int main (void)
{
  FILE *datei;
  
 
 typedef unsigned char BYTE;
 
    typedef struct{
    unsigned int Nr;
    char Nachname[20];
    char Vorname[20];
    unsigned int MatNr;
                 } tDatenStudent;


  datei = fopen ("test.txt", "r");
  if (datei != NULL)
  {
    fscanf (datei,"%s ", & tDatenStudent);
    
  }
  return 0;
}
danke
 

saftmeister

Nutze den Saft!
Premium-User
#2
Versuch mal fread():

C:
size_t numEntries = fread(&tDatenStudent, sizeof(tDatenStudent), 1, datei);
printf("Gelesene Eintraege: %d\n", numEntries);
 
#4
tDatenStudent ist ein Typ, du musst erst eine Instanz davon anlegen.

Beim nächsten mal bitte dein Problem genauer beschreiben: kompiliert das Programm überhaupt? Falls nicht: welche Fehlermeldungen werden ausgegeben? Falls ja: wie verhält sich das Programm und was würdest du stattdessen erwarten?

Grüße
Matthias
 

Hunter

Erfahrenes Mitglied
#5
Schlagt mich wenn ich falsch liege, aber wenn man am Ende eines struct, also } erst den Bezeichner angiebt, dann kann man die Daten im struct nicht mehr ändern?

Ansonsten würde ich mal GetLastError() verwenden. (#include <Windows.h>)
 
#6
Schlagt mich wenn ich falsch liege, aber wenn man am Ende eines struct, also } erst den Bezeichner angiebt, dann kann man die Daten im struct nicht mehr ändern?

Ansonsten würde ich mal GetLastError() verwenden. (#include <Windows.h>)



danke für die Hilfe , ich darf aber sowas noch nicht benutzen, da wir das noch nicht gelernt haben.

Die Aufgabestellung sieht so aus :
Entwickeln Sie ein Programm, das die in der Datei gespeicherten Daten zeilenweise
einliest und in einem Array mit der definierten Struktur speichert.
C++:
typedef unsigned char BYTE;
typedef struct{
unsigned int Nr;
char Nachname[20];
char Vorname[20|;
unsigned int MatNr;
} tDatenStudent;
 

cwriter

Erfahrenes Mitglied
#7
danke für die Hilfe , ich darf aber sowas noch nicht benutzen, da wir das noch nicht gelernt haben.
Ach, ernsthaft? Ich mag diese Lehrweise überhaupt nicht, aber gut...
Die Aufgabestellung sieht so aus :
Entwickeln Sie ein Programm, das die in der Datei gespeicherten Daten zeilenweise
einliest und in einem Array mit der definierten Struktur speichert.
Zeilenweise? Aber da hat es doch ints drin? Das ist ja ein Minenfeld...
Entweder du nimmst Saftmeisters fread und überspringst das '\n'-Byte, oder du liest alles per fscanf() ein und verteilst das dann. Aber: Unschön.

Gruss
cwriter
 
#8
du liest alles per fscanf() ein und verteilst das dann. Aber: Unschön.

meinst du das so ?
C++:
#include <stdio.h>
#include<stdlib.h>
 
int main (void)
{
  FILE *datei;
  
 
 typedef unsigned char BYTE;
 
    typedef struct{
    unsigned int Nr;
    char Nachname[20];
    char Vorname[20];
    unsigned int MatNr;
                 }tDatenStudent;


  datei = fopen ("test.txt", "r");
  if (datei != NULL)
  {
  	
  fscanf(datei, "%s",tDatenStudent);
  tDatenStudent ='\0';
  
   printf("%s\n",tDatenStudent);
   fclose (datei);
  }
  return 0;
}
 

cwriter

Erfahrenes Mitglied
#9
Nein. Das ist falsch.
fscanf() liest bis zum Whitespace. Mit den ints im struct sehr unsicher. Vielleicht beendest du die Chararrays mit '\0', auch da bricht fscanf() ab.
Ich meine sowas wie
C:
fscanf(datei,"%d%s %s %d", &s.Nr,&s.Nachname,&s.Vorname,&s.MatNr);
Bei s == dein Struct

Aber bitte nimm fread.

Gruss
cwriter
 
#10
danke für die Hilfe aber das zeigt mir imer noch den selben Fehler, das Programm erkennt nicht den struct was ich oben definiert habe !!
C++:
#include <stdio.h>
#include<stdlib.h>
 
int main (void)
{
  FILE *datei;
  
 
 typedef unsigned char BYTE;
 
    typedef struct{
    unsigned int Nr;
    char Nachname[20];
    char Vorname[20];
    unsigned int MatNr;
                 }tDatenStudent;


  datei = fopen ("test.txt", "r");
  if (datei != NULL)
  {
  	
  fscanf(datei,"%d %s %s %d", &tDatenStudent.Nr,&tDatenStudent.Nachname,&tDatenStudent.Vorname,&tDatenStudent.MatNr);
  tDatenStudent ='\0';
  
   printf("%s\n",datei);
   fclose (datei);
  }
  return 0;
}
 

cwriter

Erfahrenes Mitglied
#11
C:
#include <stdio.h>
#include<stdlib.h>
 
 typedef unsigned char BYTE;
 
struct tDatenStudent
{
    unsigned int Nr;
    char Nachname[20];
    char Vorname[20];
    unsigned int MatNr;
};
 
 
int main (void)
{
  FILE *datei;
  
  tDatenStudent tds;    //Du brachst eine Instanz, wo du die Werte tatsächlich speicherst.

  datei = fopen ("test.txt", "r");
  if (datei != NULL)
  {
    
  fscanf(datei,"%d %s %s %d", &tds.Nr,&tds.Nachname,&tds.Vorname,&tds.MatNr);
  
   printf("%s\n",datei);
   fclose (datei);
  }
  return 0;
}
Ich weiss ja nicht, wie deine Datei aussieht, aber das scheint mir doch etwas seltsam.

Erklärung: Du deklarierst den Typ tDatenStudent, der 4 + 20 + 20 + 4 Bytes = 48 Bytes gross ist. Doch diese 48 Bytes gehören dir nicht. Du sagst nur, dass tDatenStudent als Typ so viel Platz braucht. Mit der tds-Variable sagst du dem Compiler: tds ist meine Variable, und die soll bitte 48 Bytes gross sein. Und erst dann kannst du darin Werte speichern.

Gruss
cwriter
 
Zuletzt bearbeitet:
#12
C:
#include <stdio.h>
#include<stdlib.h>
 
 typedef unsigned char BYTE;
 
struct tDatenStudent
{
    unsigned int Nr;
    char Nachname[20];
    char Vorname[20];
    unsigned int MatNr;
};
 
 
int main (void)
{
  FILE *datei;
  
  tDatenStudent tds;    //Du brachst eine Instanz, wo du die Werte tatsächlich speicherst.

  datei = fopen ("test.txt", "r");
  if (datei != NULL)
  {
    
  fscanf(datei,"%d %s %s %d", &tds.Nr,&tds.Nachname,&tds.Vorname,&tds.MatNr);
  
   printf("%s\n",datei);
   fclose (datei);
  }
  return 0;
}
Ich weiss ja nicht, wie deine Datei aussieht, aber das scheint mir doch etwas seltsam.

Erklärung: Du deklarierst den Typ tDatenStudent, der 4 + 20 + 20 + 4 Bytes = 48 Bytes gross ist. Doch diese 48 Bytes gehören dir nicht. Du sagst nur, dass tDatenStudent als Typ so viel Platz braucht. Mit der tds-Variable sagst du dem Compiler: tds ist meine Variable, und die soll bitte 48 Bytes gross sein. Und erst dann kannst du darin Werte speichern.

Gruss
cwriter
ich bekommen den selben Fehler !
 

cwriter

Erfahrenes Mitglied
#13
ich bekommen den selben Fehler !
Der da ist?
Beim Kompilieren? Beim Ausführen? Text? Errorcode?
Vielleicht das
C:
int main(void)
zu
C:
int main(int argc, char* argv[])
ändern?

Ach so. Windows, hm?

C:
#include <stdio.h>
#include<stdlib.h>
 
 typedef unsigned char BYTE;
 
struct tDatenStudent
{
    unsigned int Nr;
    char Nachname[20];
    char Vorname[20];
    unsigned int MatNr;
};
 
 
int main (void)
{
  FILE *datei;
  
  tDatenStudent tds;    //Du brachst eine Instanz, wo du die Werte tatsächlich speicherst.
 
  fopen_s(datei, "test.txt", "r");
  if (datei != NULL)
  {
    
  fscanf_s(datei,"%d %s %s %d", &tds.Nr,sizeof(int),&tds.Nachname,20,&tds.Vorname,20,&tds.MatNr,sizeof(int));
  
   printf("%s\n",datei);
   fclose (datei);
  }
  return 0;
}
Gruss
cwriter
 
Zuletzt bearbeitet:
#16
Wenn das Compiliere
C++:
#include <stdio.h>
#include<stdlib.h>
 
int main(int argc, char* argv[])
{
  FILE *datei;
  
 
 typedef unsigned char BYTE;
 
    typedef struct{
    unsigned int Nr;
    char Nachname[20];
    char Vorname[20];
    unsigned int MatNr;
                 }tDatenStudent;


  datei = fopen ("test.txt", "r");
  if (datei != NULL)
  {
  	
  fscanf(datei,"%d %s %s %d", &tDatenStudent.Nr,&tDatenStudent.Nachname,&tDatenStudent.Vorname,&tDatenStudent.MatNr);
   printf("%d %s %s %d", tDatenStudent.Nr,tDatenStudent.Nachname,tDatenStudent.Vorname,tDatenStudent.MatNr);
   fclose (datei);
  }
  return 0;
}
Der Fehler lautet: expected expression before 'tDatenStudent'
 

cwriter

Erfahrenes Mitglied
#17
Aber warum denn dieser Code wieder?
Dass der falsch ist, wurde schon mehrfach gesagt. Was sagt denn der Compiler zu diesem Code?
C:
#include <stdio.h>
#include<stdlib.h>
 
 typedef unsigned char BYTE;
 
struct tDatenStudent
{
    unsigned int Nr;
    char Nachname[20];
    char Vorname[20];
    unsigned int MatNr;
};
 
 
int main (void)
{
  FILE *datei;
  
  tDatenStudent tds;    //Du brachst eine Instanz, wo du die Werte tatsächlich speicherst.
 
  datei = fopen ("test.txt", "r");
  if (datei != NULL)
  {
    
  fscanf(datei,"%d %s %s %d", &tds.Nr,&tds.Nachname,&tds.Vorname,&tds.MatNr);
  
   printf("%s\n",datei);
   fclose (datei);
  }
  return 0;
}
Gruss
cwriter
 

cwriter

Erfahrenes Mitglied
#19
Ach, du nutzt pures C?

Dann:
C:
#include <stdio.h>
#include<stdlib.h>
 
 typedef unsigned char BYTE;
 
typedef struct
{
    unsigned int Nr;
    char Nachname[20];
    char Vorname[20];
    unsigned int MatNr;
}tDatenStudent;
 
 
int main (void)
{
  FILE *datei;
  
  tDatenStudent tds;    //Du brachst eine Instanz, wo du die Werte tatsächlich speicherst.
 
  datei = fopen ("test.txt", "r");
  if (datei != NULL)
  {
    
  fscanf(datei,"%d %s %s %d", &tds.Nr,&tds.Nachname,&tds.Vorname,&tds.MatNr);
  
   printf("%s\n",datei);
   fclose (datei);
  }
  return 0;
}
Gruss
cwriter

/Edit: Darf man fragen, welchen Compiler und welche IDE du verwendest?
 
Anzeige

Neue Beiträge

Anzeige