Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : struct in ein file speichern?



suhs
13-04-2007, 18:56
hallo forum!

ich habe mir folgendes programm zur verwaltung von personen gebaut:

das einlesen und ausgeben der struktur funktioniert auch :)

jetzt wuerde ich aber gerne noch alles nach dem einlesen in ein text file speichern.

wie kann ich das machen? wo liegt mein fehler?

den code, den ich eingebunden habe funktioniert leider nicht :mad:


vielen dank und gruss,
suhs



#include <stdio.h>
#include <conio.h>
#include <string.h>

struct persManager{
int id;
int plz;

char name[256];
char strasse[256];
char ort[256];
char email[256];
char homepage[256];
};

int main()
{
printf("*** PersManager***");
printf("\t * verwaltung der einzelnen Personen *\n\n\n");

printf("Wie viele Personen moechten sie eingeben (max. 100 moeglich)? ");
int n;
scanf("%d", &n);
printf("Anzahl der Personen: %d \n\n", n);

// daten der personen in die struktur persManager einlesen
// mit der structVar "person[100]" koennen 100 personen einlesen werden
struct persManager person[100];
for(int i = 0; i <= n; i++) {
person[i].id = i;
printf("ID EINGEBEN : %d\n", i);
//scanf("%d", &person[i].id);

printf("NAME EINGEBEN : ");
scanf("%s", &person[i].name);

printf("STRASSE EINGEBEN : ");
scanf("%s", &person[i].strasse);

printf("PLZ EINGEBEN : ");
scanf("%d", &person[i].plz);

printf("ORT EINGEBEN : ");
scanf("%s", &person[i].ort);

printf("EMAIL EINGEBEN : ");
scanf("%s", &person[i].email);

printf("HOMEPAGE EINGEBEN : ");
scanf("%s", &person[i].homepage);

printf("\n");
}


// daten der personen aus der struktur persManager auslesen und
// mit printf ausgeben
for(int i = 0; i <= n; i++) {
printf("%d\n", person[i].id);
printf("%s\n", person[i].name);
printf("%s\n", person[i].strasse);
printf("%d\n", person[i].plz);
printf("%s\n", person[i].ort);
printf("%s\n", person[i].email);
printf("%s\n", person[i].homepage);

printf("\n");
}

// daten speichern
FILE *f;
char fileName[255];
struct persManager *p100;

printf("Unter welchen Namen soll gespeichert werden : ");
scanf("%s", fileName);
fflush(stdin);

f = fopen(fileName, "w");
if(f == NULL)
{
printf("Fehler beim oeffnen von: %s\n", fileName);
//return;
}

// person[100] auf das erste element
//person[100]=first;
if(p100 == NULL);
{
printf("Es gibt nichts zu Speichern!\n\n");
//return;
}

// Nun speichert man element fuer element in der liste,
// bis *p100 auf NULL zeigt und somit alle daten gespeichert wurden.
while(p100 != NULL)
{
fwrite(p100, sizeof(struct persManager),1,f);
p100 = p100->next;
}

getch();
}



/*
void saveAdressen()
{
FILE *f;
char fileName[255];
struct persManager *person[100];

printf("Unter welchen Namen soll gespeichert werden : ");
scanf("%s", fileName);
fflush(stdin);

f = fopen(fileName, "w");
if(f == NULL)
{
printf("Fehler beim oeffnen von: %s\n", fileName);
return;
}

// person[100] auf das erste element
//person[100]=first;
if(person[100] == NULL);
{
printf("Es gibt nichts zu Speichern!\n\n");
return;
}

// Nun speichert man element fuer element in der liste,
// bis *person[100] auf NULL zeigt und somit alle daten gespeichert wurden.
while(person[100] != NULL)
{
fwrite(person[100], sizeof(struct persManager),1,f);
person[100] = person[100]->next;
}

}*/

quinte17
14-04-2007, 09:37
printf("%s\n", person[i].homepage);

printf("\n");
}

// daten speichern
FILE *f;
char fileName[255];
struct persManager *p100; // NEUER zeiger

printf("Unter welchen Namen soll gespeichert werden : ");
scanf("%s", fileName);
fflush(stdin);

f = fopen(fileName, "w");
if(f == NULL)
{
printf("Fehler beim oeffnen von: %s\n", fileName);
//return;
}


// person[100] auf das erste element
//person[100]=first;
if(p100 == NULL); // Zeiger wurde nicht zugewiesen zeigt also auf undefinierte bereiche speichern kann nicht klappen desweitern hat der ';' am ende von IF nichts zu suchen...
{
printf("Es gibt nichts zu Speichern!\n\n");
//return;
}



ein wenig kommentiert... vielleicht hilft dir das bei der lösungsfindung

jay-t
19-04-2007, 18:58
Wieso willst du die Struktur so wie sie im RAM ist speichern?
Da kam schon manche Firma ins rotieren, weil solcher Code inkompatibel ist.

Übersetze das Programm mal mit einem anderen Compiler, der die Daten anders
in der Struktur ablegt, und das Ganze wird nicht mehr gehen.

Auch die Integer Variablen "id" und "plz" sind problematisch. Das hat mit der Endianess
zu tun. Auf einem Power PC Rechner (big endian) wirst du andere Werte haben als
auf einem Intel PC (little endian).

Mehr zu dem Endianess Zeugs: http://de.wikipedia.org/wiki/Endianess

Speichere das Zeug lieber als reinen ASCII Text ab. Also für Menschen lesbaren
Klartext. Das ist kompatibler und macht keinen Ärger.

suhs
19-04-2007, 23:56
Speichere das Zeug lieber als reinen ASCII Text ab. Also für Menschen lesbaren
Klartext. Das ist kompatibler und macht keinen Ärger.

vielen dank fuer diese info!

und wie kann ich das in c umsetzen?

kannst du mir vielleicht ein bisschen code posten?


vielen dank!
suhs

jay-t
20-04-2007, 13:52
Hier ist das Teil:



#include <stdio.h>
#include <conio.h>
#include <string.h>

#define TRUE 1
#define FALSE 0

struct persManager{
int id;
int plz;

char name[256];
char strasse[256];
char ort[256];
char email[256];
char homepage[256];
};

int main()
{
int n;
int save_err;
int newline = 10;

printf("*** PersManager***");
printf("\t * verwaltung der einzelnen Personen *\n\n\n");

printf("Wie viele Personen moechten sie eingeben (max. 100 moeglich)? ");

scanf("%d", &n);
printf("Anzahl der Personen: %d \n\n", n);

// daten der personen in die struktur persManager einlesen
// mit der structVar "person[100]" koennen 100 personen einlesen werden
struct persManager person[100];
for(int i = 0; i <= n; i++) {
person[i].id = i;
printf("ID EINGEBEN : %d\n", i);
//scanf("%d", &person[i].id);

printf("NAME EINGEBEN : ");
scanf("%s", &person[i].name);

printf("STRASSE EINGEBEN : ");
scanf("%s", &person[i].strasse);

printf("PLZ EINGEBEN : ");
scanf("%d", &person[i].plz);

printf("ORT EINGEBEN : ");
scanf("%s", &person[i].ort);

printf("EMAIL EINGEBEN : ");
scanf("%s", &person[i].email);

printf("HOMEPAGE EINGEBEN : ");
scanf("%s", &person[i].homepage);

printf("\n");
}


// daten der personen aus der struktur persManager auslesen und
// mit printf ausgeben
for(int i = 0; i <= n; i++) {
printf("%d\n", person[i].id);
printf("%s\n", person[i].name);
printf("%s\n", person[i].strasse);
printf("%d\n", person[i].plz);
printf("%s\n", person[i].ort);
printf("%s\n", person[i].email);
printf("%s\n", person[i].homepage);

printf("\n");
}

// daten speichern
FILE *f;
char fileName[255];

printf("Unter welchen Namen soll gespeichert werden : ");
scanf("%s", fileName);
fflush(stdin);

f = fopen(fileName, "w");
if(f == NULL)
{
printf("Fehler beim oeffnen von: %s\n", fileName);
//return;
}

/* speichern */

save_err = FALSE;
for (int i = 0; i <= n; i++)
{
if (fprintf (f, "%d,", person[i].id) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%s,", person[i].name) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%s,", person[i].strasse) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%d,", person[i].plz) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%s,", person[i].ort) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%s,", person[i].email) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%s", person[i].homepage) < 0)
{
save_err = TRUE;
break;
}

/* Zeilenende */

if (fputc (newline, f) == EOF)
{
save_err = TRUE;
break;
}
}

if (save_err)
{
printf ("Fehler beim Speichern von: %s\n", fileName);
}

/* Datei schließen */
fclose (f);
}

suhs
20-04-2007, 19:09
Hier ist das Teil:



#include <stdio.h>
#include <conio.h>
#include <string.h>

#define TRUE 1
#define FALSE 0

struct persManager{
int id;
int plz;

char name[256];
char strasse[256];
char ort[256];
char email[256];
char homepage[256];
};

int main()
{
int n;
int save_err;
int newline = 10;

printf("*** PersManager***");
printf("\t * verwaltung der einzelnen Personen *\n\n\n");

printf("Wie viele Personen moechten sie eingeben (max. 100 moeglich)? ");

scanf("%d", &n);
printf("Anzahl der Personen: %d \n\n", n);

// daten der personen in die struktur persManager einlesen
// mit der structVar "person[100]" koennen 100 personen einlesen werden
struct persManager person[100];
for(int i = 0; i <= n; i++) {
person[i].id = i;
printf("ID EINGEBEN : %d\n", i);
//scanf("%d", &person[i].id);

printf("NAME EINGEBEN : ");
scanf("%s", &person[i].name);

printf("STRASSE EINGEBEN : ");
scanf("%s", &person[i].strasse);

printf("PLZ EINGEBEN : ");
scanf("%d", &person[i].plz);

printf("ORT EINGEBEN : ");
scanf("%s", &person[i].ort);

printf("EMAIL EINGEBEN : ");
scanf("%s", &person[i].email);

printf("HOMEPAGE EINGEBEN : ");
scanf("%s", &person[i].homepage);

printf("\n");
}


// daten der personen aus der struktur persManager auslesen und
// mit printf ausgeben
for(int i = 0; i <= n; i++) {
printf("%d\n", person[i].id);
printf("%s\n", person[i].name);
printf("%s\n", person[i].strasse);
printf("%d\n", person[i].plz);
printf("%s\n", person[i].ort);
printf("%s\n", person[i].email);
printf("%s\n", person[i].homepage);

printf("\n");
}

// daten speichern
FILE *f;
char fileName[255];

printf("Unter welchen Namen soll gespeichert werden : ");
scanf("%s", fileName);
fflush(stdin);

f = fopen(fileName, "w");
if(f == NULL)
{
printf("Fehler beim oeffnen von: %s\n", fileName);
//return;
}

/* speichern */

save_err = FALSE;
for (int i = 0; i <= n; i++)
{
if (fprintf (f, "%d,", person[i].id) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%s,", person[i].name) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%s,", person[i].strasse) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%d,", person[i].plz) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%s,", person[i].ort) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%s,", person[i].email) < 0)
{
save_err = TRUE;
break;
}

if (fprintf (f, "%s", person[i].homepage) < 0)
{
save_err = TRUE;
break;
}

/* Zeilenende */

if (fputc (newline, f) == EOF)
{
save_err = TRUE;
break;
}
}

if (save_err)
{
printf ("Fehler beim Speichern von: %s\n", fileName);
}

/* Datei schließen */
fclose (f);
}



super, vielen dank!

das hat alles funktioniert:)

quinte17
26-04-2007, 21:22
ach ja, plz ist normalerweise ein string und kein int, wegen führender 0...

greetz