Datei einlesen. Noobfrage



  • FILE *source = fopen("RT-Modul.bin","rb");
      save_source = malloc(sizeof(*source));
    
      int i=0;
    	while((c = getc(source)) != EOF){
    		putc(c, save_source[i]);
    		i++;
    	}
      free(*source);
    

    Meintest du das so in etwa?
    Ich weis leider nicht, wie ich mit putc mein array füllen soll. ich sehe ja, dass es mit dem [i] nicht funktioniert. 😞



  • steffen$$ schrieb:

    Wie man allerdings sieht, muss das Array ziemlich groß sein und das File, kann auch unterschiedlich lang sein. 🙄

    nö, sieht man nicht, wo denn ? 😕
    0x3FFF bytes ist doch ein witz!

    steffen$$ schrieb:

    Ich weis leider nicht, wie ich mit putc mein array füllen soll. ich sehe ja, dass es mit dem [i] nicht funktioniert

    putc ist dafür ungeeignet. ermittle die dateigröße, besorg dir mit malloc den nötigen speicher und liest das ganze mit fread ein.
    triff ne vorkehrung für den fall das malloc scheitert, indem du den input in häppchen aufteilst.
    mfg,
    w.



  • ähm ja, hier mal ein weiterer versuch in die richtige richtung 😉

    Eigendlich müssten die Daten jetzt in ps liegen oder?
    leider kommt bei printf nur mist raus...

    unsigned char *ps;
      FILE *source = fopen("RT-Modul.bin","rb");
    
      long lsize;
    
     fseek (source , 0 , SEEK_END);
    	lsize = ftell (source);
    	rewind (source);
    
    	ps = malloc(sizeof(lsize));
    	if(ps == NULL)
    		printf("\nERROR\n");
    	fread(ps,0x100,0x3FFF,source);
    
    	for(i=0;i<0x3FFF;i++)
    	printf("%02X", ps[i]);
            fclose(source);
    	fclose(sink);
    

    sorry, für den schlechten code, bin echter c-noob...



  • Ich nochmal... sry für doppelpost...

    ich würd gerne den code benutzen, wie ich ihn hier her hab:
    http://www.cplusplus.com/reference/clibrary/cstdio/fread.html
    würde das resultat jetzt gerne benutzen bzw. printen.

    Allerdings weis ich nicht, wie ich mit dem buffer jetzt verfahren kann.
    Ich brauche die Daten in einem Array, damit ich sie Byteweise in einer Funktion verwenden kann (es werden immer 8 byte genommen und versendet).

    void ReadSourceFile( void ){
      int i;
      FILE * pFile;
      long lSize;
      char * buffer;
      size_t result;
    
      pFile = fopen ( "RT-Modul.bin" , "rb" );
      if (pFile==NULL) {fputs ("File error",stderr); exit (1);}
    
      // obtain file size:
      fseek (pFile , 0 , SEEK_END);
      lSize = ftell (pFile);
      rewind (pFile);
    
      // allocate memory to contain the whole file:
      buffer = (char*) malloc (sizeof(char)*lSize);
      if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
    
      // copy the file into the buffer:
      result = fread (buffer,1,lSize,pFile);
      if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
    
      [b]for(i=0;i<lSize;i++){
      printf("%X",buffer);[/b]
      }
    


  • da fehlte noch was am ende

    void ReadSourceFile( void ){
      int i;
      FILE * pFile;
      long lSize;
      char * buffer;
      size_t result;
    
      pFile = fopen ( "RT-Modul.bin" , "rb" );
      if (pFile==NULL) {fputs ("File error",stderr); exit (1);}
    
      // obtain file size:
      fseek (pFile , 0 , SEEK_END);
      lSize = ftell (pFile);
      rewind (pFile);
    
      // allocate memory to contain the whole file:
      buffer = (char*) malloc (sizeof(char)*lSize);
      if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
    
      // copy the file into the buffer:
      result = fread (buffer,1,lSize,pFile);
      if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
    
      for(i=0;i<lSize;i++){
      printf("%X",buffer);
      }
    
      // terminate
      fclose (pFile);
      free (buffer); 
    }
    


  • bis auf den cast vor malloc sieht das c-technisch schon ganz gut aus.



  • danke, hab ich ja auch nicht selbst geschrieben 😃

    ne, würde gerne mit fscanf den stream in ein array schreiben:

    unsigned char save[0x3FFF];
    
    fscanf(buffer, "%X", &save[]);
    

    irgendwie so, allerdings check ich net ganz, wie ich fscanf richtig benutze.
    Der stream inhalt besteht nur aus Hex werten und soll byte für byte in das array geschrieben werden.
    danke schonmal



  • fscanf nimmt man für dateien im textformat ansonsten bleib bei fread. für deinen zweck bietet sich ein array aus unsigned datentypen an, mit 32 oder 64 bit per datentypen, je nach rechner.
    die azahl der arrayelemente ist dann die (dateigröße in byte)/sizeof(_dein_datentyp).
    entsprechend deinem datentypen musst du noch die parameter für fread bzw. fscanf anpassen,

    gruß,
    B.



  • Um die Hexdaten in einen String zu packen kannst du sprintf() benutzen. Die Funktion arbeitet genauso wie fprintf() nur das sie als erstes Argument einen (char*) anstelle eines (FILE*) erwartet.



  • hey leute,
    komme leider immernoch nicht weiter mit dem problem.
    Konnte mich auch seid einer woche nicht damit beschäftigen.
    Brauche den code allerdings für mein projekt auf der arbeit...

    mir fehlt doch im prinzip nur noch die zeile um den buffer ins array zu schreiben. kann mir da keiner helfen.

    bekomme es weder mit scanf noch mit fread hin...
    danke schonmal



  • so doppelpost again... sorry

    versuche gerade rauszufinden, wies mit sprintf klappen könnte:

    an welche stelle muss denn jetzt der buffer, den ich auslesen will?
    ich checks einfach nicht...

    sprintf(save, )
    


  • ich mag selbstgespräche zwar nicht, aber hier nochmal die lösung, da es endlich geklappt hat 😃

    void ReadSourceFile( void ){
      int i;
      FILE * pFile;
      long lSize;
      unsigned char * buffer;
      size_t result;
    
      pFile = fopen ( "RT-Modul.bin" , "rb" );
      if (pFile==NULL) {fputs ("File error",stderr); exit (1);}
    
      // obtain file size:
      fseek (pFile , 0 , SEEK_END);
      lSize = ftell (pFile);
      rewind (pFile);
    
      // allocate memory to contain the whole file:
      buffer = (unsigned char*) malloc (sizeof(unsigned char)*lSize);
      if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
    
      // copy the file into the buffer:
      result = fread (buffer,1,lSize,pFile);
      if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
    
      printf("l-size: %d result:%d\n\n",lSize,result);
    
      for(i=0;i<lSize;i++)
      printf("%02X ", buffer[i]);
    
      fclose (pFile);
      free (buffer); 
    }
    

    wieso sagt mir auch keiner, dass alles schon in buffer drinsteht ^^


Anmelden zum Antworten