Problem mit formatierter Ausgabe von fprint



  • Ich habe folgendes Problem:
    Das Programm soll eine Datei hexadezimal formatiert ausgeben, hierzu sollen die entsprechenden Speicheradressen und ASCII-Zeichen mit ausgegeben werden.
    Trotz formatierter Ausgabe werden die Hex-Zahlen teilweise sechsstellig mit F aufgefüllt. (z.B. FFFFFFA7)
    Dies tritt sowohl unter Windows als auch unter Linux auf, ist also plattformunabhängig.

    #include <stdlib.h>
    #include <stdio.h>
    #include <ctype.h>
    
    void laden(char filename[30],char zeile[23][16],int block)
    {
        int ii, zz, erg;
        FILE *datei;
    
        //Array wird auf Null gesetzt
        for(zz=0;zz<23;zz++)
            for(ii=0;ii<16;ii++)
                zeile[zz][ii]=0;
    
        //Datei wird geöffnet, Zeiger *datei enthält den Dateihandle
        datei=fopen(filename,"r");
    
        //Fehlermeldung, wenn Datei nicht existiert
        if(datei==NULL)
            printf("Datei kann nicht geoeffnet werden!");
    
        //Dateizeiger auf den nächsten Block setzen (ausgehend vom Anfang
        //der Datei - SEEK_SET)
    
        /*WARUM ABER WIRD DAS VOR DEM AUSLESEN GEMACHT???*/
    
        block*=23*16;
        fseek(datei,block,SEEK_SET);
    
        //Es werden die Daten ab dem Dateizeiger für 23 Zeilen bzw. bis 
        //zum Dateiende gelesen
        for(ii=0;ii<23;ii++)
        {
                if(feof(datei)==0)
                    //jede Zeile wird mit 16 Byte (char) gefuellt
                    fread(zeile[ii], sizeof(char),16,datei);
                else
                    break;
        }
        fclose(datei);
    }
    
    void ausgabe(int block, char zeile[23][16])
    {
        int ii,zz;
        int jj;
        int znr=1;
    
        //Die Blocknummer wird mit der Blockgröße multipliziert
        jj=block;
        jj*=23*16;
    
        //Ausgabe erfolgt für 23 Zeilen
        for(zz=znr-1;zz<23;zz++)
        {
    
            //zunächst die Adresse des ersten Bytes
            printf(" %06X| ",jj);
            jj+=16;
    
            //dann die 16 Bytes in hexadezimaler Darstellung
            for(ii=0;ii<16;ii++)
            {
                printf("%02X ", zeile[zz][ii]);
            }
            printf(" ");
    
            //dann die Ausgabe in Ascii-Zeichen, falls darstellbar
            for(ii=0;ii<16;ii++)
            {
                if(isalnum(zeile[zz][ii]))
                    printf("%c",zeile[zz][ii]);
    
                //sonst Punkt (.) setzen
                else
                    printf("%c",46);
            }
            printf("\n");
        }
    }
    
    void main()
    {
        char name[100];
        int zz,ii,kk;
        char u;
        char zeile[23][16];
    
        //die Eingabe muss stattfinden, sonst tut sich nichts...
        do
        {
            printf("Bitte geben Sie den Dateinamen ein: ");
        }
        while(gets(name)==0);
    
        kk=0;
    
        //Es werden auf Tastendruck solange neue Datenblöcke ausgelesen, 
        //bis der Benutzer 'e' eingibt
        do
        {
            laden(name,zeile,kk);
            ausgabe(kk,zeile);
            kk++;
            u=getchar();
        }
        while(u!='e');
        return;
    }
    


  • printf("%02X ", zeile[zz][ii]);
    

    ändere das in

    printf("%02X ", (unsigned)zeile[zz][ii]);
    

    Der Grund ist die Vorzeichenerweiterung bei der impliziten Umwandlung von (signed) char nach int. Angenommen, du hast den Char-Code 0xA0. Das höchste Bit ist gesetzt, also nimmt eine Implementation, bei der chars vorzeichenbehaftet sind, an, dass es sich um den Wert -96 handelt. Nach int umgewandelt bleibt es bei -96, nur dass das intern natürlich nicht mehr 0xA0 ist, sondern 0xFFFFFFA0 (wenn ich mich nicht vermacht habe).
    Castest du -96 nach unsigned, wird die Vorzeichenerweiterung nicht durchgeführt, so dass der unsigned-Wert ebenfalls den Code 0xA0 hat.



  • Original erstellt von Bashar:
    **```
    printf("%02X ", zeile[zz][ii]);

    
      
      
    ändere das in  
      
    
    

    printf("%02X ", (unsigned)zeile[zz][ii]);

    Das ändert aber auch nichts🙄
    Er gibt das weiterhin mit den ganzen F's aus!:(



  • Dann versuche das hier: printf("%02X ", zeile[zz][ii] & 0xFF);



  • Oops, hat mich meine Erinnerung getäuscht, dabei hatte ich das Problem gestern erst ... also, caste nach unsigned char, nicht nach unsigned int.



  • Original erstellt von Bashar:
    Oops, hat mich meine Erinnerung getäuscht, dabei hatte ich das Problem gestern erst ... also, caste nach unsigned char, nicht nach unsigned int.

    thx, hat funktioniert:)


Anmelden zum Antworten