C Filehandling

SirPrice

Cadet 4th Year
Registriert
Dez. 2010
Beiträge
80
Hallo,

ich hab hier ein kleines Problem und ich komm einfach nicht drauf wieso es nicht hinhaun will. Ich hab hier nur meinen Teil des Programms. Ich muss von einem struct den Inhalt in ein File schreiben wobei ich einen header und footer habe der unverändert ist. Nur der content wird von mir verändert. Ich weiß die Bezeichnungen stimmen noch nicht ganz es ist auch nur ein erster Entwurf.

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

#define CONTLENGHT 161

struct eintrag
  {
    unsigned int ID;
    double lat;
    double log;
    unsigned int contentlength;
    char *name;
    char *description;
  };

char *readlist()
{
  //testcase
  struct eintrag test[2];
  test[0].name = "Stadt";
  test[0].description = "Das hier ist eine Stadt";
  test[0].lat = 154;
  test[0].log = 60;
  test[0].contentlength = 28;
  test[1].name = "Ort";
  test[1].description = "Das hier ist ein Ort";
  test[1].lat = 125;
  test[1].log = 88;
  test[1].contentlength = 25;
//-----------------------------------------------------------------------------
  
  int i;
  int anzahl = 2;
  
  int contlen = 0;
  for (i = 0; i < anzahl; i++)
  {
    contlen = contlen + CONTLENGHT + test[i].contentlength; 
  }
  char *cont = malloc(contlen * sizeof(char));
  for (i = 0; i < anzahl; i++)
  {
    char *buffer = malloc(0);
  
    sprintf(buffer, "  <Placemark>\n    <name>%s</name>\n    <description>"
                    "%s</description>\n    <Point>\n      <coordinates>"
                    "%f,%f,0</coordinates>\n    </Point>\n  </Placemark>\n",
                  test[i].name, test[i].description, test[i].log, test[i].lat);
				  
    strcat(cont,buffer);
    buffer = malloc(0);
  }
 return cont;
}

int test(char *content)
{
  char *header;
  char *footer;
    
  header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
          "<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n<Document>\n";
  
  footer = "</Document>\n</kml>\n";
    
  FILE *fp;
  fp = fopen ("file.kml", "w");
  fprintf(fp, "%s%s%s" , header, content, footer); 
  fclose(fp);
 return 0;
}

int main() 
{
  char *x = readlist();
  test(x);
  printf("\nData Stored!!!!!! \n\n %s", x);
  return 0;
}

Nun zu meinem Problem ich bekomme immer diese Fehlermeldung

Code:
*** glibc detected *** ./ex3: free(): invalid next size (normal): 0x087f61c8 ***
======= Backtrace: =========
/lib/libc.so.6[0x5c25a5]
/lib/libc.so.6(cfree+0x59)[0x5c29e9]
/lib/libc.so.6(fclose+0x136)[0x5b0c96]
./ex3[0x8048673]
./ex3[0x8048698]
/lib/libc.so.6(__libc_start_main+0xdc)[0x56ee9c]
./ex3[0x8048421]
======= Memory map: ========
0053a000-00555000 r-xp 00000000 68:01 4669464    /lib/ld-2.5.so
00555000-00556000 r-xp 0001a000 68:01 4669464    /lib/ld-2.5.so
00556000-00557000 rwxp 0001b000 68:01 4669464    /lib/ld-2.5.so
00559000-006ac000 r-xp 00000000 68:01 4669465    /lib/libc-2.5.so
006ac000-006ae000 r-xp 00152000 68:01 4669465    /lib/libc-2.5.so
006ae000-006af000 rwxp 00154000 68:01 4669465    /lib/libc-2.5.so
006af000-006b2000 rwxp 006af000 00:00 0
0096c000-00977000 r-xp 00000000 68:01 2298234    /lib/libgcc_s-4.1.2-20080825.so.1
00977000-00978000 rwxp 0000a000 68:01 2298234    /lib/libgcc_s-4.1.2-20080825.so.1
00ad2000-00ad3000 r-xp 00ad2000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 68:11 1897403060  /home/e/eisner06/ESP/ex3/ex3
08049000-0804a000 rw-p 00000000 68:11 1897403060  /home/e/eisner06/ESP/ex3/ex3
087f6000-08817000 rw-p 087f6000 00:00 0          [heap]
b7fad000-b7faf000 rw-p b7fad000 00:00 0
bfb59000-bfb6e000 rw-p bffea000 00:00 0          [stack]
Aborted

Diese Fehler bekomme ich aber nur wenn ich den Teil zum speichern mit rein nehme wenn ich mir nur den String ausgeben lasse gibts kein Problem.

Hoffentlich könnt ihr mir dabei helfen mfg
 
Etwas wirr das Ganze.

char *buffer = malloc(0); // 0 Bytes? Ein bisschen wenig?

buffer = malloc(0); /// ??? meinst du free

Schreib doch einen Eintrag direkt in die Datei, dann kannst du dir das ganze Pufferallokieren sparen.
 
Zuletzt bearbeitet:
Bitte auch bedenken, daß malloc() einen Nullpointer zurückgeben kann ... also auch gegen Null prüfen, bevor du den angeblich allozierten Speicher verwendest.
 
Bitte auch bedenken, daß malloc() einen Nullpointer zurückgeben kann ... also auch gegen Null prüfen, bevor du den angeblich allozierten Speicher verwendest.

ja das muss ich noch machen ist ja noch lange nicht fertig.
Mir ist nur unklar wo beim speichern ein Fehler liegt. Weil wenn ich mir die Strings im Programm ausgeben lasse, ohne es in eine Datei zu speichern (Zeile 67-70) geht es komischerweise.
 
Zurück
Oben