Zufällige Zeichen angezeigt, beim drucken array von Zeichen
Dies ist mein problem. Ich lese eine Datei im binary-Modus anfügen von bytes zu einem int-array und Druck-die Werte nach. Mein problem ist, wenn ich cout meine Ergebnisse, zufällige Zeichen sind befestigt, in den Strom.
comp.txt:
this text is a testt1
main.cpp:
#include <iostream>
#include <fstream>
#include <time.h>
using namespace std;
void read(ifstream& stream, unsigned int buf[], int size)
{
for(int i = 0; i < size; ++i)
{
unsigned char temp[4] = {'\0', '\0', '\0', '\0'};
stream.read((char*)temp, 4);
cout << "Temp: " << temp << '\n';
buf[i] = *((int*)temp);
cout << "Read: " << buf[i] << endl;
memset(temp, '\0', 4);
}
}
int main()
{
//open file
ifstream f;
f.open("comp.txt", ios::binary);
cout << "File opened. " << endl;
//get size
f.seekg(0, ios::end);
int l = f.tellg();
int length = (l / 4) + 1;
f.seekg(0, ios::beg);
cout << "Size found: L: " << l << " Length: " << length << endl;
//allocate byte arrays
unsigned int* buf = new unsigned int[length];
memset(buf, '\0', 4*length);
//unsigned short* key = new unsigned short[length];
cout << "Preparing to read..." << endl;
//read byte into short
cout << "Reading..." << endl;
read(f, buf, length);
f.close();
delete[] buf;
cin.ignore(1000, 10);
return 0;
}
Ausgabe:
C:\Users\daminkz\Desktop>encrypt
File opened.
Size found: L: 21 Length: 6
Preparing to read...
Reading...
Temp: this
Read: 1936287860
Temp: tex☺
Read: 2019914784
Temp: t is☻
Read: 1936269428
Temp: a t♥
Read: 1948279072
Temp: estt♦
Read: 1953788773
Temp: 1
Read: 49
Dinge zu beachten:
- temp ist nur 4 bytes, aber 5 bytes gedruckt
- Ein Rat: verlassen Sie sich nicht auf
int
32 bit breit.#include <stdint.h>
und verwendenuint32_t
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Lesen in temp, überschreiben Sie alle 4 Charaktere mit Daten, so dass Sie ohne einen NULL-terminator. cout.operator<<(char*) erwartet, dass eine null-terminierte Zeichenfolge, so dass es den Druck so viele Zeichen, wie er kann, bis es erreicht ein null-terminator. Machen temp 5 Zeichen lang sein, alle '\0', sondern um die Anzahl der bytes, die gelesen, bei der 4 wird das problem zu lindern.
buf[i] = temp[0] + (temp[1] << 8) + (temp[2] << 16) + (temp[3] << 24)
.;)
Wenn Sie halten Ihre Quellen zu schmutzig ist, bekommen Sie Fehler, und Sie haben echte Probleme loszuwerden, die Tiere.Du ausgeben temp als eine null-terminierte Zeichenfolge, aber es ist nicht null-terminiert ist, so dass Sie drucken aus 4 Zeichen temp und unbekannte Anzahl von Müll-Zeichen, bis Sie versehentlich in eine 0.
Du bist nicht null beendet den Puffer, die Sie drucken wollen.
Wenn Sie an einem char-array zu
cout
es wird umgewandelt in einen char-Zeiger, in anderen Worten, was normalerweise als ein "C-string". Dies bedeutet, dass finden Sie am Ende der Zeichenfolge, die output-routing der Suche nach dem ersten0x00
NUL-Zeichen.Array ist 4 chars jedoch, und 4 Zeichen aus der Datei gelesen werden. Wenn keiner dieser Punkte ist eine NULL, dann wird die Ausgabe Lesen Sie chars aus dem Gedächtnis, bis er eine findet und das sind die seltsamen chars Sie beobachten. Beachten Sie, dass eine weitere mögliche Folge ist ein segmentation Fault, weil Sie nicht in der Lage sein sollen, gehen herum und Lesen Sie den Speicher, dass Sie nicht explizit zuordnen.
Als Lösung könnte man erklären das array von 5 chars, statt der 4, sodass die fünfte immer auf NUL zu werden, beenden Sie die Ausgabe.