# Daten aus einem Datei einlesen und in einem struct  speichern



## amine89 (5. Januar 2014)

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



```
#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 (5. Januar 2014)

Versuch mal fread():


```
size_t numEntries = fread(&tDatenStudent, sizeof(tDatenStudent), 1, datei);
printf("Gelesene Eintraege: %d\n", numEntries);
```


----------



## amine89 (5. Januar 2014)

ne leider  hat nicht  funktioniert  !


----------



## Matthias Reitinger (5. Januar 2014)

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 (6. Januar 2014)

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>_)


----------



## amine89 (6. Januar 2014)

Hunter hat gesagt.:


> 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.

```
typedef unsigned char BYTE;
typedef struct{
unsigned int Nr;
char Nachname[20];
char Vorname[20|;
unsigned int MatNr;
} tDatenStudent;
```


----------



## cwriter (6. Januar 2014)

> 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


----------



## amine89 (6. Januar 2014)

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

meinst du  das  so  ? 
	
	
	



```
#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 (6. Januar 2014)

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

```
fscanf(datei,"%d%s %s %d", &s.Nr,&s.Nachname,&s.Vorname,&s.MatNr);
```
Bei s == dein Struct

Aber _bitte_ nimm fread.

Gruss
cwriter


----------



## amine89 (6. Januar 2014)

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 !!

```
#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 (6. Januar 2014)

```
#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


----------



## amine89 (6. Januar 2014)

cwriter hat gesagt.:


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



ich bekommen  den selben Fehler !


----------



## cwriter (6. Januar 2014)

amine89 hat gesagt.:


> ich bekommen  den selben Fehler !



Der da ist?
Beim Kompilieren? Beim Ausführen? Text? Errorcode?
Vielleicht das

```
int main(void)
```
zu

```
int main(int argc, char* argv[])
```
ändern?

Ach so. Windows, hm?


```
#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


----------



## amine89 (6. Januar 2014)

auch nicht


----------



## cwriter (6. Januar 2014)

Auch nicht mit dem Edit?
Was ist denn die Fehlermeldung?

Gruss
cwriter


----------



## amine89 (6. Januar 2014)

Wenn das  Compiliere 
	
	
	



```
#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 (6. Januar 2014)

Aber warum denn dieser Code wieder?
Dass der falsch ist, wurde schon mehrfach gesagt. Was sagt denn der Compiler zu diesem Code?

```
#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


----------



## amine89 (6. Januar 2014)

Da  bekomme ich  als Fehler
19 3 C:\Users\MAr\Desktop\bik.c [Error] unknown type name 'tDatenStudent' 

grüße
Amine


----------



## cwriter (6. Januar 2014)

Ach, du nutzt pures C?

Dann:

```
#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?


----------



## amine89 (6. Januar 2014)

ja :=)

gerade läuft das,  aber  es  wird nur  die  erste Zeile  eingelesen  und ausgegeben !

Ich  hoffe , du hast noch einbisschen Zeit und  Lust!

viel Dank


----------



## cwriter (6. Januar 2014)

amine89 hat gesagt.:


> gerade läuft das,  aber  es  wird nur  die  erste Zeile  eingelesen  und ausgegeben !


Nun, das war zu erwarten...
Könntest du ein Beispiel posten, wie die Datei aussieht?

Grundsätzlich: Schlaufe um das fscanf() herum bauen.

Gruss
cwriter


----------



## amine89 (6. Januar 2014)

Mein Text-Datei  sieht so aus :

1;StudentName1;Michael; 1112944729
2;StudentName2;Alexander;1112335117
3;StudentName3;Susanne;1148946464
4;StudentName4;Frank;1165465466
5;StudentName5;Christine;1154565445


----------



## amine89 (6. Januar 2014)

Wikipedia  hat  auch geholfen :=)

ich habe  es  so gemacht und  hat geklappt 

```
#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)
{
	int c;
  FILE *datei;
  
  tDatenStudent tds;   
 
  datei = fopen ("test.txt", "r");
  if (datei != NULL)
  {
  	 while( (c=fgetc(datei)) != EOF)
         putchar(c);
   }
   else {
      printf("Konnte Datei nicht finden bzw. öffnen!\n");
   }
   
  fscanf(datei,"%d %s %s %d", &tds.Nr,&tds.Nachname,&tds.Vorname,&tds.MatNr);
  
   printf("%d %s %s %d", tds.Nr,tds.Nachname,tds.Vorname,tds.MatNr);
   fclose (datei);

  return 0;
}
```

danke dir trozdem 

die  Aufgabe ist noch lang aber  ich  versuche  es erst  alleine  ..wenn ich aufgabe  melde ich mich xD


----------



## cwriter (7. Januar 2014)

Ähm... Du weisst aber schon, dass du gar nichts in dein struct einliest, sondern einfach den Inhalt der Datei ausgibst, oder?

```
while(fscanf(datei,"%d;%s;%s;%d",&tds.Nr,&tds.Nachname,&tds.Vorname,&tds.MatNr) != EOF)
{
    printf("%d %s %s %d", tds.Nr,tds.Nachname,tds.Vorname,tds.MatNr);
}
```
So wäre es besser.

Gruss
cwriter


----------



## deepthroat (7. Januar 2014)

Und so

```
while(fscanf(datei,"%d;%s;%s;%d",&tds.Nr,&tds.Nachname,&tds.Vorname,&tds.MatNr) == 4)
{
    printf("%d %s %s %d", tds.Nr,tds.Nachname,tds.Vorname,tds.MatNr);
}
```
wäre es noch besser. Da damit wenigstens sichergestellt ist, das alle Daten eingelesen wurden.

Noch _besserer_ wäre es wirklich zeilenweise einzulesen (fgets) und die Zeile dann mit sscanf zu verarbeiten.


----------

