# Datei binär einlesen



## Bastih84 (25. April 2005)

Ich suche eine Möglichkeit eine Datei binär einzulesen unter c bzw. unter c++. Mein Ziel ist es einen Digitalen Datenstrom (DVB-T) binär einzulesen und auszuwerten, Projektarbeit an der Fachhochschule.


----------



## Bastih84 (25. April 2005)

Hab da mal einen Ansatz, allerdings liest er nur Nullen ein, hat einer eine Idee, wo der Fehler liegt 


#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <fstream.h>




main ()
{


   ifstream strom;

   int ch;

   strom.open("c:\\zdf.ts", ios::binary);


   if (strom.bad())
   {
      cout << "Kann Datei nicht öffnen" << endl;

   }
   for(int i=0;i<600;i++)
   {
      strom >> ch;
      cout << ch;
   }

   cout << endl;

return 0;

}


----------



## Tobias K. (26. April 2005)

moin


Statt ios::binary nimm mal ios_base::binary

Und wenn du es binär machen willst kannst du nciht mehr  strom >> ch; schreiben.
Du musst dann strom.read(....) und strom.write(....) verwenden.


mfg
umbrasaxum


----------



## Bastih84 (26. April 2005)

wenn ich ios_base mache, mekkert er dass das keine Klasse oder Namespace wäre, was muss ich machen, muss ganz erlich gestehen, dass ich von Klassen keine große Ahnung habe, habe bis vor kurzen nur mit C gearbeitet


----------



## canuzzi (26. April 2005)

Fuer deine Aufgabe ist vielleicht sogar c die elegantere Loesung. Generell kommt es darauf an ob du ios::binary oder ios_base::binary verwendest, welchen Kompiler du verwendest. Da hier der Standard mal geaendert wurde ...


----------



## Tobias K. (26. April 2005)

moin


Aha das ist also der Unterschied zwischen ios::binary und ios_base::binary.

Aber zum Thema.
Wie ist die zdf.ts denn Aufgebaut? Wofür ist die Datei da?
Ich gehe mal davon aus das du sie nicht richtig im Editor betrachten kannst.


mfg
umbrasaxum


----------



## canuzzi (26. April 2005)

Ja, ziemlich trivialer Unterschied. bios_base ist im uebrigen der neue Standard.


----------



## Bastih84 (26. April 2005)

Ich kann das Teil im Editor betrachten, ist aber leider nur wirres Zeug, mein Ziel ist es, diese Datei (Ein DVB-T Strom) in eine Folge von 0en und 1en zu zerlegen, also richtig binär auslesen


----------



## Tobias K. (26. April 2005)

moin


Warum?


mfg
umbrasaxum


----------



## Tobias K. (26. April 2005)

moin


Also:
Liess z.B. immer 1Byte große Stücke ein, wandle das in eine Zahl um (zwischen 0 und 255)und errechne daraus den Binärcode den du in einem String speicherst, der dann immer 8 Stellig sein sollte (musst dann vielleicht vorne noch ein zwei oder mehr Nullen dran packen.


mfg
umbrasaxum


----------



## canuzzi (26. April 2005)

Kannst du irgendwo eine Beispielsdatei hinterlegen?


----------



## Bastih84 (26. April 2005)

Beispieldatei ist schlecht, das einzige was ich habe, ist 80MB groß, werde mal ein paar Zeilen aus der Datei kopieren, ob der Inhalt noch Sinn macht weiß ich nicht, ist ja eigentlich auch egal, ich brauche im Prinzip aus dieser Datei eine Folge von 0en une 1en, also eine binäre Datenfolge, in diesem Strom muss ich dann irgendwelche abfolgen von Bits suchen z.B. synchronisationsbits, ist glaube 1000 0110 oder ähnlich, nur als Anmerkung was ich damit vor habe.

Habe mal einen Ausschnitt angehängt, allerdings als txt, sollte ja aber eigentlich egal sein, ihr könnt es ja auch in ts umbenennen


----------



## canuzzi (26. April 2005)

So hier mal eine Version in c und eine in c++. Hinsichtlich Fehler und Ausnahmen ist noch nichts beruecksichtigt. Eventuell musst du dir noch ueber unsingned/signed Daten machen. Die Ausgabe ist als Oktalzahlen, fuer binaere Ausgabe musst du dir noch was ueberlegen. Fuer Berechnungen ist diese Form aber schon ganz gut.


```
/* c++ Version */
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[]) {

    unsigned int c;
    ifstream in(argv[1],ios::binary);

    while(in) {
	c=in.get();
	cout << oct << c << " ";
    }
    cout << endl;

    return 0;
}
```


```
/* c Version */
#include <stdio.h>

int main(int argc,char* argv[]) {
    FILE* fp;
    fp=fopen(argv[1],"r");
    int c;

    while((c=getc(fp))!=EOF)
	printf("%o ", c);

    return 0;
}
```


----------



## Bastih84 (26. April 2005)

Ich habe den code ein wenig geändert:


```
ifstream in("c:\\zdf.ts",ios::binary);
```

allerdungs kann ich mir nicht erklären für was das argv[1] sein soll Ohne geht es im großen und ganzen


----------



## Tobias K. (26. April 2005)

moin


Das ist ein Parameter dem du deinem Programm bei starten mitgeben kannst.
Z.B. könnte dein Programmaufruf so ausshen: "test.exe zdf.tv"


mfg
umbrasaxum


----------



## Bastih84 (27. April 2005)

Welche Möglichkeiten gibt es die Daten in eine Variable zu bekommen Ich würde versuchen das ganze in einen Array zu bekommen, gibts da bessere Möglichkeiten unter c++


----------



## Tobias K. (27. April 2005)

moin



```
char zeichen;
char array[100];

int i=0;

while((zeichen = datei.get()) != EOF)
{
    array[i++] = zeichen;
}
```


mfg
umbrasaxum


----------

