Datei einlesen

:confused: mich wunderts, daß der code so überhaupt compiliert (bei mir klappts so nämlich nicht)

2fast4you87 hat gesagt.:
Code:
#include <iostream.h>
ist ein header für c++ (allerdings bitte <iostream> verwenden)

2fast4you87 hat gesagt.:
Code:
#include <stdio.h>

ist ein header für C (reines C)

Warum verwendest Du überhaupt iostream, wenn Du keine Streams verwendest?
Willst Du das Program in C oder C++ schreiben?

Ich würde das ganze in C++ schreiben und Streams verwenden.
Google doch einfach mal ifstream und ofstream, die machen das Leben wesentlich leichter
als kleiner link: http://www.cplusplus.com/ref/iostream/ostream/write.html

und bitte, kein
Code:
void main()
verwenden
main hat als return-value immer int (die meisten compiler nehmen zwar auch void, ist allerdings unsauberes programmieren).
 
Wozu den ganzen Overhead von C++ für so eine simple Aufgabe...

Code:
#include <stdio.h>

void main()
{
FILE *oFile=0, *iFile=0;
int buffer=0;

oFile = fopen("testin.jpg", "r+b");
iFile = fopen("testout.hex", "w+b");

if((long)oFile*(long)iFile)
  do
  {
      buffer=fgetc(iFile);
      fprintf(oFile,"%X",(char)buffer);
  }while(!feof(iFile));

if(oFile)
  fclose(oFile);

if(iFile)
  fclose(iFile);
}

funktioniert einwandfrei und ist simpler als if/ofstreams...
 
freakyjoe hat gesagt.:
funktioniert einwandfrei und ist simpler als if/ofstreams...
Also ich weiß ja nicht, aber ich finde folgenden Code lesbarer und keinesfalls komplizierter:
Code:
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
    ifstream in("test.jpg", ios::in | ios::binary);
    ofstream out("test.hex");
    
    if (!in.is_open() || !out.is_open()) return 1;
	
    out << hex;
    
    while (!in.eof()) {
        out << in.get();
    }    
    
    return 0;
}
 
nett nur mal ein Größenvergleich der Ausführbren Datei....
beide kompiliert mit Open Watcom mittels:

W32, XP, opt. schnellster Code, "dead code elimination":

wpp386 noname.cpp -i=H:\watcom\h;H:\watcom\h\nt -w4 -e25 -zq -otexan -5r -bt=nt -mf
wlink name noname d locals SYS nt op m op maxe=25 op q op symf op el @noname.lk1

dein Code 43008 Byte
mein Code: 34.304 Byte

hab meinen Code auch mit dem CPP-Compiler übersetzten lassen, mit C wärs noch krasser geworden (meiner Erfahrung nach)...

Es sind immerhin fast 10k unterschied!

Der Assembler-Source des CPP ist miserabel, nicht les/nachbearbeitbar.... soviel also zu dem Thema...

Johannes
 
freakyjoe hat gesagt.:
nett nur mal ein Größenvergleich der Ausführbren Datei....
beide kompiliert mit Open Watcom mittels:

[...]

dein Code 43008 Byte
mein Code: 34.304 Byte
Das macht deinen Quellcode auch nicht les-/wartbarer…

Der Assembler-Source des CPP ist miserabel, nicht les/nachbearbeitbar.... soviel also zu dem Thema...
Was interessiert mich das Disassemblat (das meintest du wohl mit „Assembler-Source“)? Das lass ich nun wirklich nicht als Argument durchgehen. Primär ist doch mal die Lesbarkeit und Nachvollziehbarkeit wichtig (vor allem, wenn man noch nicht so firm in der jeweiligen Programmiersprache ist). Feinoptimiert wird wenn dann erst am Schluss.
 
Du kannst am sourcfe optimieren was du willst, wenn der Compiler das nicht anders übersetzt...

Wenn man ISRs und auch Treiber schreibt, dann interessiert es einen schon, was der ASM-Source liefert... der wird dann mit Feinschliff bearbeitet und neu assembliert.

Für Anfänger wäre es nicht schlecht, vor C++ ein ganz großes Stück C abzubeißen, dann "flutscht" alles besser... ;-)

und nochwas: mein Code ist lesbar/wartbar.

außerdem sieht man was passiert (-> lerneffekt über hintergründe) , das ist in C++ alles in den Klassen versteckt.

Johannes
 
freakyjoe hat gesagt.:
Du kannst am sourcfe optimieren was du willst, wenn der Compiler das nicht anders übersetzt...
Triviale Aussage, nur wo ist der Bezug zum Thema? Optimierungen machen natürlich nur Sinn, wenn am Ende was anderes rauskommt, das ist mir schon klar.

Wenn man ISRs und auch Treiber schreibt, dann interessiert es einen schon, was der ASM-Source liefert... der wird dann mit Feinschliff bearbeitet und neu assembliert.
Darum geht es aber hier nicht :rolleyes:

Für Anfänger wäre es nicht schlecht, vor C++ ein ganz großes Stück C abzubeißen, dann "flutscht" alles besser... ;-)
Kann ich nicht nachvollziehen.

und nochwas: mein Code ist lesbar/wartbar.
Für dich schon. Aber ein Code wie if((long)oFile*(long)iFile) ist nicht gerade schön zu lesen und vor allem von Anfängern nicht recht leicht richtig interpretierbar.

außerdem sieht man was passiert (-> lerneffekt über hintergründe) , das ist in C++ alles in den Klassen versteckt.
Es ist doch der Sinn einer höheren Programmiersprache, zu abstrahieren. So lässt sich wesentlich näher an der eigentlichen Problemstellung arbeiten.

Gruß,
Matthias
 
Das 2.te programm ist in meinen Augen recht gut, weil es mir ja die Daten in Hex gibt, nur ich habe ein anderes problem. Daten ausgabe in HEX kein problem.

Dann die Daten einlesen auch nicht das Thema, nur dann wieder in Ascii, sprich als Zeichen speichern ?

Muss ich das manuel mit ner Rechnung machen, wie z.B

HEX 21 ist DEZ 33 also ascci ==> !

(2*16^1)+(1*16^0) = 33 ASCII ==> !

oder gibt es da wieder sowas wie out >> dez ?

Habt ihr da ne Ahnung ?
 
Am einfachsten verwendet man hier einen stringstream, in den man einen Hexadezimalstring reinsteckt und aus dem man anschließend eine Ganzzahl rausholt:
Code:
#include <string>
#include <sstream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
    ofstream out("test", ios::out | ios::binary);
    string str = "21";      // String mit Hexadezimalzahl
    stringstream ss;        // Stringstream zur Umwandlung
    int c;                  // zur Speicherung des Zahlenwerts
        
    ss << hex << str;       // Hexadezimalzahl rein...
    ss >> c;                // ...Ganzzahl raus
    out.put(c);             // Ausgabe in Datei
    
    return 0;
}
 
wenn mich nicht alles täuscht dann ließt doch das Programm alles bitweise ein, sprich nur immer ein wert von der Hex Zahl ...

z.B.

2DFF1F

das heißt der ließt 2 als eine zahl und wandelt die dann um in dez.
ich muss aber dann 2D einlesen.
Soll ich dann immer erst nen 2er array machen und die dann zu einem strign hinzufügen ?
 
Zurück