Problem mit formatierter Array-Ausgabe
-
ich versuch ein verdammtes programm um nur eine datei auszulesen um formatiert links den wert von jedem byte und rechts das entsprechende ascii zeichen auszugeben, aber nach stundenlangem probieren bleibt immernoch der fehler dass ganz am anfang einfach ein leerzeichen ausgegeben wird. hier der code:
void printBuffer(CHAR* buffer,int size, int m) { unsigned int cnt=0; //buchstaben in der zeile unsigned int n_zfln=0; cout<<"************** printing buffer with size of "<<size<<"*******************"<<endl; for(int i=0; i<size;i++) { unsigned int tmpznln=0, n=0; cout<<(int)buffer[i]<<" "; for(n=0, tmpznln=buffer[i]; tmpznln; tmpznln/=10, n++);//anzahl der zeichen von den char werten, +1 weil die immer durch ein leerzeichen getrennt sind n_zfln+=n+1; cnt++; if(buffer[i]=='\n' || cnt==10) { for(int j=0; j<45-n_zfln;j++)// der platz zwischen den char werten und den zeichen wird mit leerzeichen aufgefüllt cout<<' '; for(int h=cnt; h>0; h--) { if(buffer[i-h]!='\n') cout<<buffer[i-h]; } cnt=0; n_zfln=0; cout<<endl; } } cout<<endl<<"**************************************************************"<<endl; }in der for schleife wo die ascii zeichen ausgegeben werden könnte das problem liegen, aber ich weis nicht genau wo.
wo liegt also das problem hier?
-
Keine Ahnung was du da tust, aber wenn du zu jedem Zeichen einer Datei den ASCII-Wert ausgeben möchtest, gibt es bessere Wege. Da solltest du nochmals von vorne Anfangen, damit du dabei auch was gescheides lernst.
-
keine ahnung wovon zu da sprichst, womit soll ich von vorne anfangen? und welchen anderen weg für ausgabe sollte es da geben? teste doch das programm und dann sieh was ich da tue.
-
Meinst du sowas?
#include <iostream> #include <fstream> int main() { using namespace std; ifstream datei("datei.txt"); if(!datei.is_open()) { cout << "Konnte Datei nicht oeffnen!\n"; return 0; } for(char ch; datei >> ch; cout << int(ch) << ' ' << ch << '\n'); }Du sprichst aber ganz schön wirr. Vielleicht lieg ich auch voll daneben..
-
nein, das programm soll immer 10 zeichen (oder weniger wenn vorher ein zeilenumbruch kam) einlesen und dann diese 10 zeichen links als ints ausgeben und rechts als text, oder umgekehrt. dazwischen soll immer der gleiche abstand sein, egal wie lang die zeile war. das tut der code den ich gepostet hab auch, nur wird ganz am anfang jeder ausgabe ein zusätzliches leerzeichen ausgegeben, keine ahnung wieso.
-
Hallo Nikolai,
Die Ausgabe der Zeichen am Ende enthält einen Zählfehler. In Zeile 20 muss es heißen:
for(int h=cnt-1; h>=0; h--)Statt aufwendig die Länge einer einzelnen Integer-Zahl zu bestimmen und mit zuzählen, würde ich Dir den Manipulatior std::setw empfehlen. Der erfordert ein #include <iomanip>.
Das vereinfacht Dein Programm signifikant:
void printBuffer(CHAR* buffer,int size, int m) { unsigned int cnt=0; //buchstaben in der zeile unsigned int n_zfln=0; cout<<"************** printing buffer with size of "<<size<<"*******************"<<endl; for(int i=0; i<size;i++) { cout<< setw(3) <<(int)buffer[i]<<" "; // hier dafür sorgen, dass die Zahl immer 3 Zeichen 'breit' ist cnt++; if(buffer[i]=='\n' || cnt==10) { for( int cnt2 = cnt; cnt2 < 10; ++cnt2 ) // falls weniger als 10 Zahlen ausgegeben wurden, Lücke füllen cout << " "; // setw(3) + " " cout<<' '; for(int h=cnt-1; h>=0; h--) { if(buffer[i-h]!='\n') cout<<buffer[i-h]; } cnt=0; n_zfln=0; cout<<endl; } } cout<<endl<<"**************************************************************"<<endl; }Der Algorithmus enthält noch den Fehler, dass in der letzten Zeile die Ausgabe der Buchstaben fehlt, wenn sie nicht mit '\n' endet oder genau 10 Zeichen enthält.
Weiter würde ich Dir empfehlen in Zeile 22 statt der Prüfung auf '\n' auf isprint zu checken. Und wenn das Zeichen nicht druckbar ist, einen Punkt auszugeben.Gruß
Werner
-
ich versteh kaum wieso das alles nicht richtig funktioniert.
erstmal wird überhaupt nichts ausgegeben wenn ich nach !isprint prüfe, dann weis ich nicht wie ich die letzte zeile noch ausgeben kann. wenn ich bei dem if statement noch ein || i==size-1 hinzufüge wird das letzte zeichen nicht ausgegeben...