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:)