Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Binärdatei laden und speichern. Problem mit z.b. GIF-Dateien

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.12.2004, 20:46 Uhr
MrCPU



Hallo liebe C++ Programmierer,

habe ein programm geschrieben zum öfnen von binärdateien unbekannter größe, und zum speichern derselbigen. bei selbst angelegten dateien via programm selbst, oder texteditor öffnet das programm anbei die datei und speichert sie identisch wieder ab ohne das sie dabei verändert wird. dies funktioniert aber nicht mit .gif dateien .jpgs und eigentlich allen anderen dateiformaten die doch eigentlich auch binärdateien sind?
warum nicht? was muß ich modifizieren damit ich JEDE datei als binärezeichen folge öffnen und speichern kann?
weiß jemand rat? ich bin um jeden Tip sehr dankbar,
mfg
Markus G. alias MrCPU

C++:
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>

struct stat results;
char arry1[53687091];
char arry2[53687091];

void main(void)
{

    //größe ermitteln
    stat("c:\\test.bin",&results);
    cout << results.st_size << endl << endl;


   // zum Lesen öffnen
   FILE *Datei = fopen("c:\\test.bin","r");
   // Array aus der Datei lesen und ausgeben
   fread(arry1,sizeof(arry1[0]),results.st_size,Datei);
  
   for(int i=0;i<20;i++)
   {
       cout << arry1[i] << '\n';
   }

   // Schließen der Datei
   fclose(Datei);



   // Datei c:\test.bin zum Schreiben öffnen
   Datei = fopen("c:\\test.bin","w");
    
   //schreiben
   fwrite(arry1,sizeof(arry1[0]),results.st_size,Datei);


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



Bearbeitung von Pablo:

WIE OFT MUSS MAN SAGEN, DASS IHR SELBER DIE CPP TAGS BENUTZEN SOLLT???


Dieser Post wurde am 19.12.2004 um 20:54 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.12.2004, 20:58 Uhr
Pablo
Supertux
(Operator)


1. es heißt int main() nicht void main!
2. benutze CPP Tags selber!

Binärdaten kannst du nicht mit dem Flag "r" öffnen, weil fopen dann nur als Text Datei öffnen wird. Für Binär Datein musst du fopen mit "rb" aufrufen und dann fread und fwrite benutzen. Binärdaten haben Zeichen, die sozusagen nicht darstellbar sind, und deshalb werden Daten von den gif Dateien verloren. Das gleiche gilt fürs Schreiben, "wb".
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 19.12.2004 um 21:00 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.12.2004, 21:08 Uhr
Hans
Library Walker
(Operator)


Hi,

was für eine Art von Ausgabe erwartest Du denn? - Soll das Programm das Bild anzeigen, das in den GIF's, JPG's usw. codiert ist? - Wenn nein, dann vergleiche die Ausgaben mal mit dem, was ein Hexeditor anzeigt, wenn Du die Datei damit öffnest. - Wahrscheinlich zeigt der das Gleiche an.
Wenn ja, dann musst Du Dich mit dem internen Aufbau der Dateien beschäftigen. Jede Datei besitzt einen Kopf (engl. Header), in dem die ersten Bytes eine ganz bestimmte Bedeutung haben. Dieser Kopf dient dazu, dem Programm mitzuteilen, wie die nachfolgenden Datenbytes der Datei zu interpretieren sind. Welche Bytes dabei was bedeuten ist von Dateityp zu Dateityp unterschiedlich, und dem entsprechend muss für jeden Typ eine extra Funktion vorhanden sein, die diese Daten auswertet. Nähere Information zu Dateitypen bzw. Dateiformaten findest Du hier.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.12.2004, 21:12 Uhr
Pablo
Supertux
(Operator)


zu jpgs/png kannst du auch jpeg- bzw. png-lib benutzen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.12.2004, 21:31 Uhr
~MrCPU
Gast


Den Dateitypinternen Zusammenhang ist für mich garnicht von Interesse. Ich will sie weder anzeigen noch direkt daten auslesen. Ich will nur zugriff auf alle "Bits" in der datei haben. Sie ungeändert wieder speichern, oder manipulieren können. bit für bit.

und DANKE PABLO, ich denke du hast mir genau das gesagt was ich suche. nur muß ich noch versuchen das einzubaun, bin noch recht neu mit c++. Werde etwas rumexperimentieren müssen damit es mit den genannten befehlen läuft. Kann ich eigentlich direkt die flags zum lesen und speichern ändern, und den schreib und lesebefehl wie du sagtest auf die andere methode umschreiben?

Morgen werd ichs auf jeden fall einfach mal probieren, und danke für die schnelle antwort!

mfg
MrCPU
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.12.2004, 21:40 Uhr
Pablo
Supertux
(Operator)



Zitat von ~MrCPU:
Kann ich eigentlich direkt die flags zum lesen und speichern ändern, und den schreib und lesebefehl wie du sagtest auf die andere methode umschreiben?


ich verstehe nicht ganz, was du meinst.

Bei dir musst folgendes stehen:


C++:
FILE *Datei = fopen("c:\\test.bin","rb");
...
Datei = fopen("c:\\test.bin","wb");


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.12.2004, 21:43 Uhr
Pablo
Supertux
(Operator)


Ich habe einmal sowas geschrieben, was du willst, ich hab den Code gefunden:


C++:
#define MAX_LENGTH 4096

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <malloc.h>

static void fehl_meldung(const char *fmt, va_list az)
{
    char puffer[MAX_LENGTH];
    vsprintf(puffer, fmt, az);
    fprintf(stderr, "%s\n", puffer);
}

/*---------------------- global error routine -----------------------*/
void error_call(const char *fmt, ...)
{
    va_list az;

    va_start(az, fmt);
    fehl_meldung(fmt,az);

    va_end(az);
}

...

int copyfile(const char* source, const char* destiny)
{  
  FILE* src, *dty;
  unsigned int read=0;
  char buffer[MAX_LENGTH];

  if((src=fopen(source, "rb")) == NULL)
    return -1;
  if((dty=fopen(destiny, "wb")) == NULL) {
    fclose(src);
    return -2;
  }

  while( (read = fread(buffer,1,MAX_LENGTH, src)) > 0 ) {
    if(read != fwrite(buffer, 1, read, dty)) {
      fclose(dty);
      fclose(src);
      error_call("Not all data could be copied into %s. Proc. aborted.", destiny);
      return -3;
      }
  }

  fclose(dty);
  fclose(src);
  return 0;
}



das ist der interessante Teil, der Code ist insgesamt 8.8 KB groß.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.12.2004, 22:03 Uhr
Hans
Library Walker
(Operator)



Zitat von ~MrCPU:
Den Dateitypinternen Zusammenhang ist für mich garnicht von Interesse. Ich will sie weder anzeigen noch direkt daten auslesen. Ich will nur zugriff auf alle "Bits" in der datei haben. Sie ungeändert wieder speichern,


okay, soweit so gut. Aber:

Zitat:
oder manipulieren können. bit für bit.

wenn Du sie manipuliert wieder abspeicherst, dann erwarte nicht, das die Programme, die mit diesen Dateitypen normalerweise arbeiten, deine geänderten Versionen noch richtig verarbeiten. Das werden sie sehr wahrscheinlich nämlich nicht tun. - Es sei denn, Du weisst genau was Du tust...

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.12.2004, 20:38 Uhr
~MrCPU
Gast


Manipulieren im sinne von verschlüsseln, um sie danach seperat wieder in den ursprungszustand zurückzuverschlüsseln Man hat ja sonst nichts zu tun

nochmal vielen vielen dank für die ganzen tips von euch, ich werde weiter versuchen das gebacken zu bekommen, mein problem ist jetzt einzig die zeit under weihnachtsstress ihr versteht

wünsch euch ein schönes fest, ich poste wieder wenns noch probleme geben sollte,
danke an alle,

mfg
MrCPU

PS: echt super forum hätte nie gedacht so geholfen zu werden
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.12.2004, 20:55 Uhr
~MrCPU
Gast


PERFEKT
war ja wirklich nur pipifax
alles funktioniert perfekt dank diesem einem mini B wie binär ok, es kam zweimal im code vor.
jetzt funktioniert es einwandfrei mit allen dateitypen, fehlt nur noch die Prozedur zur Datenverarbeitung. und das krieg ich gebacken bin ja immerhin der unglaublich unprofessionelle nixblickende MrCPU (AMD)

schönes fest!

MrCPU
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: