Dateieinlesen: Er liest zu viel ein
-
Hallo!
Ich will eine XML Datei in einen char* einlesen und mache das so:
ifstream file(filename); file.seekg(0, ios::end); unsigned int fileSize = static_cast<unsigned int>(file.tellg()); char* fileStr = new char[fileSize + 1]; file.seekg(0, std::ios::beg); file.read(fileStr, fileSize); file.close(); fileStr[fileSize] = 0;Das Problem ist nur, das irgendwas nicht stimmt. fileSize ist 839 und das scheint zu viel zu sein.
Die XML Datei endet mit "</Map>" aber in dem string fileStr kommen noch ca. 30 Zeichen nach dem </Map>!
Sprich, das Ende von fileStr sieht so aus:[805] 77 'M'
[806] 97 'a'
[807] 112 'p'
[808] 62 '>'
[809] -51 'Í' // hier sollte eigentlich die 0 stehen
[810] -51 'Í'
[811] -51 'Í'
[812] -51 'Í'
...
[838] -51 'Í'
[839] 0Meine Datei endet wirklich nach </Map>
Weiß jemand wieso nach meinem </Map> noch die ganzen ASCII Zeichen mit Integerwert -51 kommen?
-
Ändere das Öffnen der Datei mal:
ifstream file(filename, std::ios::binary);In deiner XML-Datei wird wohl "\r\n" (zwei Bytes) als Zeilentrenner genutzt sein, die zwei Bytes pro Zeilenumbruch sind natürlich auch in FileSize mit drin. Das
file.readliest afaik formatiert ein, d.h. es wandelt die Zeilenumbrüche in "\n" (ein Byte) um, womit das alles kürzer wird. Im Rest steht halt zufällig -51 drin.Alternativ (eventuelle Fehler vorbehalten):
#include <iterator> ... ifstream file(filename); std::string fileStr( std::istream_iterator<char>(file), std::istream_iterator<char>() );
-
Aber wenn ich die Datei binär öffne, sollte er doch auch \r\n mitzählen?

-
Ok habs gerade getestet: In beiden Fällen (mit ios::binary und ohne) ist fileSize 1007. Aber wenn ich ios::binary angebe, dann wird im char array fileStr sofort nach </Map> mit 0 terminiert. Hä?? Wie kann das sein? Is doch beide Male 1007?
-
Guck mal auf die Position des 0 Zeichens und die Position des </Map> in den beiden verschiedenen Modi. Dann dürfte dir ein Licht aufgehen.