bitmuster --> zahl?



  • hallo,

    aus einer pgm-datei möchte ich das bitmuster einlesen, doch ich bin mir nicht sicher, ob es klappt. eine pgm-datei sieht so aus:

    Identifikation: 'P5'
    WHITESPACE
    Bildbreite (ASCII Dezimal)
    WHITESPACE
    Bildhöhe (ASCII Dezimal)
    WHITESPACE
    maximaler Grauwert [255 oder kleiner] (ASCII Dezimal)
    WHITESPACE
    Bilddaten in binärer Form (Breite*Höhe)
    (Pro Pixel jeweils ein Wert zwischen 0 und dem angegebenen Maximalwert.)

    ich öffne die datei mit einem ifstream, schreibe die daten in ein array of char (buffer) und möchte nur das bitmuster daraus kopieren (also die bilddaten). mit dem zugriff buffer[stand], wobei stand eine 0<=stand<laenge, bekomme ich den zugriff auf einzelne zeichen. mit z.b. buffer[0] bekomme ich wirklich das "P" am anfang der pgm-datei. doch nach dem letzten whitespace bekomme ich mit cout << buffer[0] nur murks raus - klar, ist ja auch das bitmuster. doch dieses bitmuster möchte ich nun wieder in eine zahl wandeln, doch da fehlt mir der ansatz. cout << (int)buffer[zahl] liefert mir zwar zahlen, aber nur merkwürdige: viel zu große, negative - also ganz falsche zahlen. dabei können diese zahlen nur zwischen 0 und 255 groß sein...

    auch mit printf() und %u, %d, ... habe ich es nicht hinbekommen, ordentliche zahlen auszugeben. deshalb bitte ich euch um hilfe 🙂 benötige ich einen ganz anderen befehl? oder denke ich ganz falsch?

    falls es hilft, hier mal ein ausschnitt aus dem quellcode:

    ifstream in;
    in.open("blablupp.pgm", ios::binary);
    
    in.seekg (0, ios::end);
    laenge = in.tellg();
    in.seekg (0, ios::beg);
    
    buffer = new char [laenge];
    
    in.read(buffer, laenge);
    
    in.close();
    
    cout << (int)buffer[stand];   // da kommt nichts brauchbares mehr raus...
    

    ich würde mich über einen tipp sehr freuen,
    danke 🙂

    martin



  • Also der Code ist ja so ziemlich der von hier:
    http://www.cplusplus.com/reference/iostream/istream/read/
    An dem scheint es nicht zu liegen.

    Ich denke du hast eher ein Denkproblem.
    Geh doch mal mit dem Debugger durch. Wenn du das File eingelesen hast und es in das Array gefüllt hast, dann kannst du dir die Daten ja im Debugger anschauen. Da solltest du sehen, ob es korrekt ist.

    Du solltest da mit einmal lesen die komplette Datei drin haben.



  • das lesen scheint zu funktionieren. wenn ich einen wert aus buffer[stand] kopiere und ihn in einer ascii-tabelle suche (beispiel "ñ") bekomme ich die richtige zahl (241) heraus. und genau diese zahl möchte ich nun darstellen...


  • Mod

    inspire schrieb:

    das lesen scheint zu funktionieren. wenn ich einen wert aus buffer[stand] kopiere und ihn in einer ascii-tabelle suche (beispiel "ñ") bekomme ich die richtige zahl (241) heraus. und genau diese zahl möchte ich nun darstellen...

    Das machst du aber eigentlich richtig mit dem gezeigten Cast.

    Gib uns mal ein compilierbares(!) Beispiel das deinen Fehler zeigt, eine kurze Beispiel PGM-Datei (ein paar Handvoll Zeichen reichen), deine Ausgabe zu dieser Datei und deine Meinung, was eigentlich herauskommen sollte.

    Ich vermute nämlich, dass du etwas anderes erwartest als du beschreibst.

    Außerdem sollte man sagen, dass chars auch nur Zahlen sind, so lange man nicht versucht sie auszugeben. Wenn es dir darum geht mit Zahlen weiterzurechnen, dann kannst du einfach die eingelesenen chars nehmen.



  • SeppJ schrieb:

    Außerdem sollte man sagen, dass chars auch nur Zahlen sind, so lange man nicht versucht sie auszugeben. Wenn es dir darum geht mit Zahlen weiterzurechnen, dann kannst du einfach die eingelesenen chars nehmen.

    der hinweis hat mir gefehlt, vielen dank!! 😃 die weitere verarbeitung der chars funktioniert wirklich einwandfrei, die ganzen merkwürdigen zeichen haben mich nur stutzig gemacht. deshalb habe ich versucht, ihre dezimalzahl auszugeben, um sie zu überprüfen. also sowas: aus dem char "a" (zeichen) in der ausgabe wollte ich eine "97" (ascii dezimal) machen. also von einer tabellenspalte in die andere:
    http://www.torsten-horn.de/techdocs/ascii.htm

    ich benötige es jetzt nicht mehr, aber dennoch würde es mich interessieren, wie man das machen könnte 😉

    gruß
    martin


  • Mod

    inspire schrieb:

    ich benötige es jetzt nicht mehr, aber dennoch würde es mich interessieren, wie man das machen könnte 😉

    Eigentlich so: cout << static_cast<int>('a'); . Gibt 97 auf ASCII kompatiblen Zeichensätzen.
    Aber das hattest du ja im Prinzip so, weswegen ich mal annehmen, dass noch irgendein anderer Fehler im Programm war.



  • es liegt wohl an ein paar besonderen zeichen, wie z.b. dem "ÿ".
    bei
    cout << static_cast<int>('ÿ');
    ist die ausgabe eine -1, obwohl die ansi-zahl laut tabelle eine 255 wäre...die ascii-zeichen funktionieren alle, die ansi-erweiterungen anscheinend nicht.


  • Mod

    inspire schrieb:

    es liegt wohl an ein paar besonderen zeichen, wie z.b. dem "ÿ".
    bei
    cout << static_cast<int>('ÿ');
    ist die ausgabe eine -1, obwohl die ansi-zahl laut tabelle eine 255 wäre...die ascii-zeichen funktionieren alle, die ansi-erweiterungen anscheinend nicht.

    Das ist normal. char kann auch ein vorzeichenbehafteter Typ sein. Dann sind die Zahlen >127 negativ.



  • ah ich verstehe! 🙂 danke dir!


Anmelden zum Antworten