Verzweifle, bitte helfen...



  • Ich hab ihr Programm, das aus einer Txt den Text in ein bmp einlesen soll.
    Das klappt ganz gut, nur wenn ich sonderzeichen im Text habe, ließt er sie nicht zurück. Also macht er z.B. aus einem ä ein d oder so...
    Vieleicht wisst ihr ja wo das Problem liegt.

    //---------------------------------------------------------------------------

    #include <vcl.h>
    #include <stdio>
    #include <string.h>
    #include <sys\stat.h>
    #include <time.h>

    #pragma hdrstop

    #include "Unit1_Projekt.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent
    Owner)
    : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    FILE *Datei;
    FILE *Datei2;

    char *buffer =new char;
    char *buffer2 =new char;

    int i;
    int k;
    int l;
    //______________________
    struct stat statbuf; //Für die größe der Datei

    //----------------------

    Datei=fopen("E:\hehe.bmp","r+b"); //Die Datei wird in dem Pointer zugeteilt
    Datei2=fopen("E:\lol.txt","r+");

    /* Erhalten von Informationen über die Datei */
    fstat(fileno(Datei2), &statbuf);
    //statbuf.st_size;

    for (int k = 0; k < statbuf.st_size; k++)
    {

    fseek(Datei2,k,SEEK_SET);

    fread(buffer2,1,1,Datei2);

    //ShowMessage(buffer2); // Was steht gerade im buffer drin?

    //------------------------------------------------------------- Invertieren
    for (int i = 0; i < 8; i++)
    {
    fseek(Datei, 54+i+(k*8) ,SEEK_SET);
    fread(buffer,1,1,Datei);

    if(((*buffer2 & 1) ==1) && ((*buffer & 1)==0))
    {
    *buffer=*buffer^1;
    fseek(Datei, 54+i+(k*8) ,SEEK_SET);
    fwrite(buffer,1,1,Datei);
    }

    if(((*buffer2 & 1) ==0) && ((*buffer & 1)==1))
    {
    *buffer=*buffer^1;
    fseek(Datei, 54+i+(k*8) ,SEEK_SET);
    fwrite(buffer,1,1,Datei);
    }

    *buffer2 = *buffer2>>1;
    }
    }
    fclose(Datei);
    fclose(Datei2);

    }

    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    FILE *Datei;
    FILE *Datei2;
    FILE *Datei3;
    char *buffer =new char;

    struct stat statbuf; //Für die größe der Datei
    Datei=fopen("E:\hehe.bmp","r+b");
    Datei2=fopen("E:\hehe2.txt","w");
    Datei3=fopen("E:\lol.txt","r");

    /* Erhalten von Informationen über die Datei */
    fstat(fileno(Datei3), &statbuf);
    //statbuf.st_size;
    //---------------------------------------------------- Byte Auslesen

    for(int k =0; k<statbuf.st_size; k++)
    {

    char bit[8];

    for (int i = 0; i < 7; i++)
    {

    fseek(Datei, 54+i+(k*8) ,SEEK_SET);
    fread(buffer,1,1,Datei);

    if((*buffer & 1)==1)
    {
    bit[i]=1;
    }
    else
    {
    bit[i]=0;
    }
    }
    //----------------------------------------------------

    Memo1->Lines->Text= 1*bit[0] + 2*bit[1] + 4*bit[2] + 8*bit[3]
    + 16*bit[4] + 32*bit[5] + 64*bit[6] + 128*bit[7];

    char *f = new char;

    *f = 1*bit[0] + 2*bit[1] + 4*bit[2] + 8*bit[3]
    + 16*bit[4] + 32*bit[5] + 64*bit[6] + 128*bit[7];

    fseek(Datei2,k,SEEK_SET);
    fwrite(f,1,1,Datei2);

    Edit2->Text = Edit1->Text+*f;

    }
    fclose(Datei);
    fclose(Datei2);
    fclose(Datei3);
    }
    //---------------------------------------------------------------------------



  • Das liegt daran das ASCII kein ä,ö,ü,ß unterstützt,Unicode hingegen schon... Hab aber keine ahnung wie das Prob zu beheben ist^^

    Xalon



  • Benny G. schrieb:

    Ich hab ihr Programm, das aus einer Txt den Text in ein bmp einlesen soll.
    Das klappt ganz gut, nur wenn ich sonderzeichen im Text habe, ließt er sie nicht zurück. Also macht er z.B. aus einem ä ein d oder so...
    Vieleicht wisst ihr ja wo das Problem liegt.

    wenn du den text als binärdaten behandelst, sollte das nicht passieren. vielleicht könnt's daran liegen, dass bei einem 'fopen' das 'b' fehlt.



  • Benny G. schrieb:

    Ich hab ihr Programm, das aus einer Txt den Text in ein bmp einlesen soll.
    Das klappt ganz gut, nur wenn ich sonderzeichen im Text habe, ließt er sie nicht zurück. Also macht er z.B. aus einem ä ein d oder so...
    Vieleicht wisst ihr ja wo das Problem liegt.

    Hab den Code nur mal überflogen, ein paar Sachen sind mir dabei aufgefallen.

    *buffer2 = *buffer2>>1;

    char ist zwar nicht explizit als signed oder unsigned definiert, bei den meisten Implementationen ist char jedoch signed. Wie Xalon schon sagt, liegen zB Umlaute ausserhalb des einfachen ASCII Zeichensatzes (0..127), sind somit negative char Werte. Shift Operatoren mit negativen Werten eines signed Types zu benutzen, liefert aber laut Standard undefiniertes Verhalten.

    Datei=fopen("E:\hehe.bmp","r+b");
    

    String Literale können Escape Sequenzen enthalten, eingeleitet durch ein '\'. Willst du also einen Backslash selbst im String, dann musst du auch die richtige Escape Sequenz dafür benutzen:

    Datei=fopen("E:\\hehe.bmp","r+b");
    

    Ist zwar nicht falsch, aber wozu das?

    char *buffer =new char;
    

    Wozu dynamischen Speicher, wenn du sowieso nur ein Zeichen brauchst?

    Für solche Sachen

    if((*buffer & 1)==1)
    {
    bit[i]=1;
    }
    else
    {
    bit[i]=0;
    }
    

    darfst du ruhig boolsche Logik verwenden:

    bit[i] = (*buffer & 1)==1;
    

    Sollte sich dein Compiler wegen irgendwelchen bool Umwandlungen beschweren, dann kann man ihn auch mit dem ?: Operator besänftigen.

    bit[i] = (*buffer & 1)==1 ? 1 : 0;
    

    Und benutze das nächste mal bitte Code-Tags. Das motiviert auf jedenfall Fall mehr, sich deinen Code durchzuschauen.


Anmelden zum Antworten