"We are back" « oc.at

C Problem mit struct:

sLy- 04.12.2010 - 20:44 1244 12
Posts

sLy-

semiconductor physicist
Avatar
Registered: Aug 2005
Location: AUT
Posts: 1580
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
Code:
typedef struct
{
  int id;
  double rating;
  int content_length;
} Header;

struct Content
Code:
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:

Code:
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:

Code:
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:

Code:
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)
Code:
list->header = {5,6,7}
und damit auch nicht das speichern:
Code:
fwrite(list->header, sizeof(Header), 2, output);

Wie kann ich das umgehn und so wie ganz oben auf header zugreifen?

Ringding

Pilot
Avatar
Registered: Jan 2002
Location: Perchtoldsdorf/W..
Posts: 4300
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

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von sLy-
es geht aber nicht mehr: (syntax error before { token)
Code:
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 ;)

Zitat von sLy-
und damit auch nicht das speichern:
Code:
fwrite(list->header, sizeof(Header), 2, output);
fwrite erwartet einen pointer, also &list->header

Zitat von sLy-
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
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Zitat von watchout
@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
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13504
Zitat von watchout
@Ringding: fwrite erwartet einen pointer... ;)
Er meint die Pointer im struct, nicht den pointer zum struct für fwrite.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von that
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 :confused:

@Spikx: same.

Spikx

My Little Pwny
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13504
Zitat von watchout
Er schreibt doch den header da is kein einziger pointer zu sehen :confused:

@Spikx: same.
Er schreibt und lädt aber auch 'Content'.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
oh *dort*... Finds grad hart dass das 3 Leute gesehen haben und ich nicht :o

Spikx

My Little Pwny
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13504
Zum Initialisierungsproblem: evt. musst du
Code:
Header header[2] = { {1,3.5,10} , {2,9.0,10} };
list->header = header;
machen.

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von Spikx
Zum Initialisierungsproblem: evt. musst du
Code:
Header 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
Avatar
Registered: Aug 2005
Location: AUT
Posts: 1580
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
Avatar
Registered: Feb 2007
Location: /etc/graz
Posts: 2855
ESP Ex3? ^^

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von sLy-
naja geht leider nicht
Invalid Input.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz