sLy-
semiconductor physicist
|
hallo ich komm mit structs noch nicht ganz zurecht. Es soll schlussendlich darauf hinauslaufen eine struct zu speichern. Folgendes funktioniert ja schon mal: struct Header typedef struct
{
int id;
double rating;
int content_length;
} Header;
struct Content typedef struct
{
char *title;
char *mp3_name;
char *interpreter;
char *comment;
} Content;
ich habe jetzt mit folgenden code den content und den header mal werte zugeordnet und dann in einer binary datei gespeichert, was auch ganz gut geklappt hat: int main()
{
Header header[2] = { {1,3.5,10} , {2,9.0,10} };
Content content[2] = { {"title 1","name1","interpret1","comment1"} , {"title 2","name2","interpret2","comment2"} };
Header header2[2];//
Content content2[2];//
//DATEN BINÄR SPEICHERN!!!
FILE *output = fopen("file", "wb"); // append binary
if (output) // file opened OK
{
int writtenheader = fwrite(header, sizeof(Header), 2, output);
int writtencontent = fwrite(content, sizeof(Content), 2, output);
printf("%d records written to file.\n", writtenheader+writtencontent);
fclose(output);
}
//DATEN BINÄR LADEN!!!
FILE *input = fopen("file", "rb"); // append binary
if (input) // file opened OK
{
int readheader = fread(header2, sizeof(Header), 2, input);
int readcontent = fread(content2, sizeof(Content), 2, input);
printf("%d records read from file.\n", readheader+readcontent);
fclose(input);
}
jetzt hab ich aber folgendes Problem. wenn ich jetzt noch eine struct erstelle, in die die anderen 2 reinkommen: typedef struct DataItem_
{
Header header;
Content content;
struct DataItem_ *right; // pointer to next item
struct DataItem_ *left; // pointer to previos item
} DataItem;
wie kann ich dann den gesamten header auf einmal speichern, bzw ihm einen wert zuordnen? Ich kann die werte einzeln vergeben mit zB: DataItem = *list;
list = malloc(sizeof(DataItem));
list->header.id = 5;
list->header.rating = 6;
list->header.content_lenght = 7;
es geht aber nicht mehr: (syntax error before { token) list->header = {5,6,7}
und damit auch nicht das speichern: fwrite(list->header, sizeof(Header), 2, output);
Wie kann ich das umgehn und so wie ganz oben auf header zugreifen?
|
Ringding
Pilot
|
Die Pointer in ein File speichern ist sinnlos. Du willst ja die Inhalte und nicht die (zufälligen) Adressen im Speicher. Du musst dir wohl zuerst das Fileformat überlegen.
|
watchout
Legendundead
|
es geht aber nicht mehr: (syntax error before { token)
list->header = {5,6,7}
';' fehlt am ende das sollte den Syntax error aber erst in der nächsten Zeile werfen Die Notation ist afair nur für die Initialisierung zugelassen, das könnte einen Syntax error werfen, und die Stelle würde passen mehr fällt mir gerade nicht ein und damit auch nicht das speichern:
fwrite(list->header, sizeof(Header), 2, output);
fwrite erwartet einen pointer, also &list->header Wie kann ich das umgehn und so wie ganz oben auf header zugreifen? Union mit Byte-Array oder Casten. So wie ganz oben geht afaik nicht. @Ringding: fwrite erwartet einen pointer...
Bearbeitet von watchout am 05.12.2010, 11:10 (Header is ja gar kein Pointer... Ringi verwirrt...)
|
that
Hoffnungsloser Optimist
|
@Ringding: fwrite erwartet einen pointer... Trotzdem ist es sinnlos, wenn nach dem Schreiben der struct Content 4 Pointer im File stehen, dafür keine Strings.
|
Spikx
My Little Pwny
|
@Ringding: fwrite erwartet einen pointer... Er meint die Pointer im struct, nicht den pointer zum struct für fwrite.
|
watchout
Legendundead
|
Trotzdem ist es sinnlos, wenn nach dem Schreiben der struct Content 4 Pointer im File stehen, dafür keine Strings. Er schreibt doch den header da is kein einziger pointer zu sehen @Spikx: same.
|
Spikx
My Little Pwny
|
Er schreibt doch den header da is kein einziger pointer zu sehen
@Spikx: same. Er schreibt und lädt aber auch 'Content'.
|
watchout
Legendundead
|
oh *dort*... Finds grad hart dass das 3 Leute gesehen haben und ich nicht
|
Spikx
My Little Pwny
|
Zum Initialisierungsproblem: evt. musst du Header header[2] = { {1,3.5,10} , {2,9.0,10} };
list->header = header;
machen.
|
watchout
Legendundead
|
Zum Initialisierungsproblem: evt. musst duHeader header[2] = { {1,3.5,10} , {2,9.0,10} };
list->header = header;
machen. Die Typen passen "nicht ganz" und für C99 muss es in einen Block ({}) Sonst würd ich auch sagen das sollt funktionieren
|
sLy-
semiconductor physicist
|
naja geht leider nicht und hab auch keine lösung gefunden. Hab jetzt jeden inhalt einzeln gespeichert - is zwar nicht ganz elegant gelöst - aber was solls ^^
trozdem danke für die hilfe!
|
JDK
Oberwortwart
|
ESP Ex3? ^^
|
watchout
Legendundead
|
naja geht leider nicht Invalid Input.
|