fscanf liefert 0, warum ?

N'abend,
wir haben im Infounterricht die Aufgabe bekommen eine Mitarbeiterkartei zu erstellen (um struct zu üben) mit der Zusatzmöglichkeit diese in Form einer Textdatei zu speichern/auslesen/verändern.
Um einen Eintrag zu löschen setzte ich einen... ich nenne ihn: Filepointer mit rewind zu beginn auf 0, dann soll mit fscanf der Eintrag ausgelesen werden und überprüft werden, ob dieser dem zu beginn eingegebenen Namen, der gelöscht werden soll, entspricht:
Code:
[...]int Auswahl = 0;
               struct Mitarbeiter Neu;
               rewind(datei); // Filepointer an den Anfang setztn von wo aus gesucht wir
               printf("Wer soll geloescht werden?");
               scanf("%s", &Neu.Vorname);
               while (Auswahl != 1)
               {
                               char Vorname[15];
                               fscanf(datei, "%s", &Vorname);
                               printf("Vorname: %s", Vorname);
                               if (Vorname == Neu.Vorname)
                               {
                                                //Den Rest auslesen
                                                Auswahl = 1;                                                                  }
                               else
                               {
                                               fseek(datei, 1, SEEK_CUR);
                               }
                 }//While Ende[...]
Jedoch erfolgt eine Endlosschleife bei der die Ausgabe "Vorname: 0" ist.
Wie kommt es dazu und wie kann ich es lösen ?
So sieht das struct aus:
Code:
struct Mitarbeiter
{
       char Vorname[15];
       char Nachname[25];
       char Strasse[25];
       char Strassennummer[3];
       char Postleitzahl[4];
       char Gehalt[15];
       char Alter[2];
       char Verheiratet; // ja = 1, nein = 2
       char Anz_Kinder[2];
};
0wnZ
 
Hey

Was mir jetzt so auf den ersten Blick auffällt:
Code:
if (Vorname == Neu.Vorname)
Sollte eg nicht funktionieren
Code:
if( !strcmp(Vorname, Neu.Vorname) ){
//Vorname entspricht Neu.Vorname
//Wenn du == machst, vergleichst du ja die Adressen, wo die Strings stehen, was ja nicht sehr sinnvoll ist ;)
}
Ist soweit ich das weiß richtig^^
Dann würd ich immer ein ganzes Struct aus der Datei auslesen,
also in etwa so:
Code:
Mitarbeiter data;
datei.read((char*) &data, sizeof(Mitarbeiter));

So nebenbei:
Wieso machst du alles als char?
Alter && Postleiitzahl wäre doch als Float sinnvoller
MfG
 
Zuletzt bearbeitet:
Als char mache ich das, weil sich das besser zeigen lässt (wenn ich probeweise die Datei öffnen will um zu zeigen, dass alles korrekt geschrieben worden ist). Außerdem würde ich Alter und Postleitzahl als ints nehmen, da die bestimmt keine Nachkommastellen haben, es sei denn man ist mitm Alter sehr pingelich :D. Außerdem ist das Alter normalerweise >100 und unsere plz hat auch nur 5 Stellen in DE.

Dein erster Gedanke war der Richtige, danke.
Ich glaube die Funktion read gibt es für C zum Datei auslesen nicht, das einzige was ich bei google gefunden habe, war :http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/read.html und da bin ich mir nicht ganz sicher, ob es so auch funzt, wobei mit deiner Hilfe auch alles so klappt ;)

Danke schön

0wnZ

PS: So siehts jetzt aus
Code:
int Auswahl = 0;
                             struct Mitarbeiter Neu;
                             rewind(datei); // Filepointer an den Anfang setztn von wo aus gesucht wird
                             printf("Wer soll geloescht werden?");
                             scanf("%s", &Neu.Vorname);
                             while (Auswahl != 1)
                             {
                                           char Vorname[15];
                                           fscanf(datei, "%s", &Vorname);
                                           printf("Vorname: %s", Vorname);
                                           if ( !strcmp(Vorname, Neu.Vorname) )
                                           {
                                                       //Den Rest auslesen
                                                       Auswahl = 1;
                                           }
                                           else
                                           {
                                               fseek(datei, 1, SEEK_CUR);
                                           }
                             }//While Ende
 
argh ich meinte auch int, sry^^

Es wird aber in c garantiert eine Funktion geben wie read()
vllt heißt sie ja fread oder sowas.
 
Als char mache ich das, weil sich das besser zeigen lässt (wenn ich probeweise die Datei öffnen will um zu zeigen, dass alles korrekt geschrieben worden ist).
Auch wenn es normal lesbar in der Datei steht, kannst du es mit fscanf(datei, "%i", &i) in einen Int lesen.

@über mir:
Was du meinst ist ist fputs().
fread() gibt es zwar auch, aber das gehört zum Einlesen von Binärdateien. Für Textdateien ist das etwas übertrieben.
 
Nabend
hab hier mal kurz was zusammengeschrieben.
Vielleicht hilft dir das weiter. Also so würd ich das machen.

Code:
#include "stdio.h"

FILE *fp;

struct sTest {
  char a[10];
  int b;
  float c;
};

typedef struct sTest test;

int main () {
  test a, b;

  sprintf(a.a, "aaaaa");
  a.b = 200;
  a.c = 1.5;

  printf("a: %s\n", a.a);
  printf("b: %d\n", a.b);
  printf("c: %f\n", a.c);

  // Schreiben der Daten
  fp = fopen("xxx.dat", "w+");
  if (NULL != fp) {
    fwrite(&a, sizeof(a), 1, fp);
    fclose(fp);
  }

  // Lesen der Daten
  fp = fopen("xxx.dat", "r");
  if (NULL != fp) {
    fread(&b, sizeof(b), 1, fp);
    fclose(fp);
  } 

  printf("a: %s\n", b.a);
  printf("b: %d\n", b.b);
  printf("c: %f", b.c);

  return 0;
}

Und so kannst du dein komplettes struct schreiben und lesen.
Du kannst dir auch ein Array von "struct sTest" erstellen und das komplette Array schreiben und lesen.

MfG


Edit: Mit meiner Methode würde das ganze natürlich als binäre Datei abgespeichert.
 
Zurück
Oben