Was für die ::Hyper.Experten...Am verzweifeln :-(



  • camper schrieb:

    evtl. solltest du mal die eingangsdaten zeigen

    jop, kein Problem...hier ist die Quelldatei, die ich auslese:
    (ausgelesen mit Texteditor: Zeichen werden also tw. falsch interpretiert, da im Binärmodus geschrieben)
    Quelldatei:

    DEF_IDXPOS_GFX#FILE_VERSION#÷  #DATAPOS_BLOCK_BEGIN##IPLB_BLOCK_BEGIN#E   %O   #IPLB_BLOCK_END##IITF_BLOCK_BEGIN#q   %s   #IITF_BLOCK_END##ISTP_BLOCK_BEGIN#•   %—   #ISTP_BLOCK_END##DATAPOS_BLOCK_END#IDXPOS_GFX_ENDDEF
    

    Hier die Ausgabe in der DosBox (via std::cout):

    DEF_IDXPOS_GFX#FILE_VERSION#,[Herzchen]
    

    [Herzchen] ist im warsten Sinne des Wortes ein kleines Herz...was ich hier leider nicht einfügen konnte 😃

    Emm @camper: Noch mal Frage: Was ist (ein) POD ? 🤡

    camper schrieb:

    eleganter ist aber, den new-operator dafür einzusetzen:

    Jo hast Recht! ...Das sieht echt schöner aus... 👍 Gute Idee! Danke! 😉

    _______________________________________________________________

    Ich hab noch was total komisches raus gefunden...der folgende Code funktioniert und gibt den Inhalt vollständig auf die Konsole aus:

    fsIdxFile.seekg(0L); // nochmal annen Anfang
        for(char ch; fsIdxFile.get(ch) && cout.put(ch); ); // Ausgabe
    

    ...Ich versteh das nicht 😕 😞 🙄


  • Mod

    Expertensucher schrieb:

    Ich hab noch was total komisches raus gefunden...der folgende Code funktioniert und gibt den Inhalt vollständig auf die Konsole aus:

    fsIdxFile.seekg(0L); // nochmal annen Anfang
        for(char ch; fsIdxFile.get(ch) && cout.put(ch); ); // Ausgabe
    

    ...Ich versteh das nicht 😕 😞 🙄

    da die datei im binärmodus beschieben wurde, enthält sie offenbar auch \0 zeichen eingebettet. das ist aber gleichzeitig der terminator für C-strings. du könntest das ganze vor der ausgabe in einen std::string verwandeln (der eingebettete \0 enthalten darf) - dabei aber aufpassen, den fehler nicht zu wiederholen:

    cout << string(pszFileBuffer,ulFileBytes);
    

    auf das +1 kannst du bei der reservierung dann verzichten - da der puffer ohnehin nicht als c-style string dienen kann. dieses +1 dient ja gerade dazu, noch einen terminator am ende zu haben.

    Emm @camper: Noch mal Frage: Was ist (ein) POD ?

    POD steht für "plain old data" (das ist ein offizieller begriff des standards). gemeint sind damit datentypen, die sich wie datentypen in C verhalten (nicht alle - wie z.b. memberpointer - existieren auch in C). die exakte definition is rekusiv:
    - alle built-ins und enums sind PODs
    - arrays sind PODs, wenn ihre elemente PODs sind
    - klassen sind PODs, wenn sie
    -- weder selbstdefinierte Konstruktoren noch selbstdefinierten destruktor haben, und
    -- keine virtuellen funktionen haben, und
    -- nicht von einer basisklasse erben, und
    -- keine protected oder private elemente haben, und
    -- alle member PODs sind, und
    -- wahrscheinlich noch etwas, das ich gerade vergessen habe
    das prinzip müsste klar werden



  • Hi camper...erstmal danke für deine Bemühungen/Ausführungen bzgl. POD^^ ... 👍

    Also ich hab das:

    camper schrieb:

    cout << string(pszFileBuffer,ulFileBytes);

    einfach mal ausprobiert...Aber das hat nix gebracht...gleiches (unvollständiges) Ergebnis wie zuvor mit "cout << pszFileBuffer << endl << endl;"

    camper schrieb:

    enthält sie offenbar auch \0 zeichen eingebettet

    Ja muss sie ja...naja ich schreibe die Datei so:

    // TAG:		DEF_IDXPOS_GFX
    	fsIdxFile.write(cszFTBeginIdxFile, strlen(cszFTBeginIdxFile)); // <- Dateianfangs-Tag schreiben
    	// TAG:		#FILE_VERSION#
    	fsIdxFile.write(cszFTFileVersion, strlen(cszFTFileVersion)); // <- Dateiversion-Tag schreiben
    	// VALUE:	lFileVer
    	fsIdxFile.write(reinterpret_cast<char*>(&lFileVer), sizeof(long)); // <- Dateiversion schreiben
    	// TAG:		#DATAPOS_BLOCK_BEGIN#
    	fsIdxFile.write(cszFTIdxBlockBegin, strlen(cszFTIdxBlockBegin)); // <- Datenpositionsblockanfang-Tag schreiben
    
    	// TAG:		#IPLB_BLOCK_BEGIN#
    	fsIdxFile.write(cszFTPlaybackBegin, strlen(cszFTPlaybackBegin)); // <- Playback-Blockanfang-Tag schreiben
    	// VALUE:	IPlaybackCfg.dspDSetPos.ulBegin
    	fsIdxFile.write(reinterpret_cast<char*>(&this->IPlaybackCfg.dspDSetPos.ulBegin), sizeof(unsigned long));
    	// TAG:		%
    	fsIdxFile.write(reinterpret_cast<const char*>(&chSeparator), sizeof(char)); // <- Wert-Trennzeichen schreiben
    	// VALUE:	IPlaybackCfg.dspDSetPos.ulEnd
    	fsIdxFile.write(reinterpret_cast<char*>(&this->IPlaybackCfg.dspDSetPos.ulEnd), sizeof(unsigned long));
    	// TAG:		#IPLB_BLOCK_END#
    	fsIdxFile.write(cszFTPlaybackEnd, strlen(cszFTPlaybackEnd)); // <- Playback-Blockend-Tag schreiben
    
    	// TAG:		#IITF_BLOCK_BEGIN#
    	fsIdxFile.write(cszFTInterfaceBegin, strlen(cszFTInterfaceBegin)); // <- Interface-Blockanfang-Tag schreiben
    	// VALUE:	IInterfaceCfg.dspDSetPos.ulBegin
    	fsIdxFile.write(reinterpret_cast<char*>(&this->IInterfaceCfg.dspDSetPos.ulBegin), sizeof(unsigned long));
    	// TAG:		%
    	fsIdxFile.write(reinterpret_cast<const char*>(&chSeparator), sizeof(char)); // <- Wert-Trennzeichen schreiben
    	// VALUE:	IInterfaceCfg.dspDSetPos.ulEnd
    	fsIdxFile.write(reinterpret_cast<char*>(&this->IInterfaceCfg.dspDSetPos.ulEnd), sizeof(unsigned long));
    	// TAG:		#IITF_BLOCK_END#
    	fsIdxFile.write(cszFTInterfaceEnd, strlen(cszFTInterfaceEnd)); // <- Interface-Blockend-Tag schreiben
    
    	// TAG:		#ISTP_BLOCK_BEGIN#
    	fsIdxFile.write(cszFTStartupBegin, strlen(cszFTStartupBegin));
    	// VALUE:	IOptionsCfg.IStartupCfg.dspDSetPos.ulBegin
    	fsIdxFile.write(reinterpret_cast<char*>(&this->IOptionsCfg.IStartupCfg.dspDSetPos.ulBegin), sizeof(unsigned long));
    	// TAG:		%
    	fsIdxFile.write(reinterpret_cast<const char*>(&chSeparator), sizeof(char)); // <- Wert-Trennzeichen schreiben
    	// VALUE:	IOptionsCfg.IStartupCfg.dspDSetPos.ulEnd
    	fsIdxFile.write(reinterpret_cast<char*>(&this->IOptionsCfg.IStartupCfg.dspDSetPos.ulEnd), sizeof(unsigned long));
    	// TAG:		]%[
    	fsIdxFile.write(cszStrLengthSep, strlen(cszStrLengthSep)); // <- Informations-Trennzeichen schreiben
    	// VALUE:	IOptionsCfg.IStartupCfg.uiLenKeyName
    	fsIdxFile.write(reinterpret_cast<char*>(&this->IOptionsCfg.IStartupCfg.uiLenKeyName), sizeof(unsigned int));
    	// TAG:		%
    	fsIdxFile.write(reinterpret_cast<const char*>(&chSeparator), sizeof(char)); // <- Wert-Trennzeichen schreiben
    	// VALUE:	IOptionsCfg.IStartupCfg.uiLenKeyPath
    	fsIdxFile.write(reinterpret_cast<char*>(&this->IOptionsCfg.IStartupCfg.uiLenKeyPath), sizeof(unsigned int));
    	// TAG:		#ISTP_BLOCK_END#
    	fsIdxFile.write(cszFTStartupEnd, strlen(cszFTStartupEnd));
    
    	// TAG:		#DATAPOS_BLOCK_END#
    	fsIdxFile.write(cszFTIdxBlockEnd, strlen(cszFTIdxBlockEnd));
    	// TAG:		IDXPOS_GFX_ENDDEF
    	fsIdxFile.write(cszFTEndIdxFile, strlen(cszFTEndIdxFile));
    

    ...Da muss es doch ne Lösung zu geben 😞



  • Hmm hab noch mal ne Frage wie kann ich denn das:

    fsIdxFile.seekg(0L); // nochmal annen Anfang
        for(char ch; fsIdxFile.get(ch) && cout.put(ch); ); // Ausgabe
    

    statt auf cout innen std::string umleiten ?...Also das 'ch' sozusagen immer an den String anhängen... ?
    vllt. klappt das ja... 💡 ...also vollständig OHNE C-Strings, nur mit ner einfachen char-Variable 👍

    Boah is das ne Kagge...das muss doch irg wie funktionieren...*grummel*



  • std::cout <<  std::string("Hel\0lo", 6) << std::endl;
    

    funzt bei mir



  • tja schrieb:

    std::cout <<  std::string("Hel\0lo", 6) << std::endl;
    

    funzt bei mir

    Oha...was gibt er denn bei dir da aus...bei mir steht da nur "Hel" ...mehr nicht 😕 😕 😕 😕 😕



  • Hab noch was ausprobiert:

    // ...
    	string strLoad;
    	for(char chRead; fsIdxFile.get(chRead); )
    		strLoad += chRead;
    	cout << strLoad;
    // ...
    

    und das funktioniert auch nicht ... (gleiche unvollständige Ausgabe)
    Kann echt nicht wahr sein 😡 😞 😡 😞



  • Ausgabe: Hel lo

    Mit MinGW.



  • Hmm ich hab Microsoft Visual C++ 6.0 ...Aber das würde ja bedeuten mein Compiler is schrott bzw. der M$ Compiler hat n fetten Bug...


  • Mod

    Expertensucher schrieb:

    Hmm ich hab Microsoft Visual C++ 6.0 ...Aber das würde ja bedeuten mein Compiler is schrott bzw. der M$ Compiler hat n fetten Bug...

    das sollte mittlerweile bekannt sein. der compiler hat bereits einige jahre auf dem buckel und wird auch nicht mehr supported.



  • camper schrieb:

    Expertensucher schrieb:

    Hmm ich hab Microsoft Visual C++ 6.0 ...Aber das würde ja bedeuten mein Compiler is schrott bzw. der M$ Compiler hat n fetten Bug...

    das sollte mittlerweile bekannt sein. der compiler hat bereits einige jahre auf dem buckel und wird auch nicht mehr supported.

    Ist das dein ernst ????? Du meinst echt, daran liegt es ??? ...*schluck*

    Hmm welchen Compiler benutzt du denn ? Wenn ich mal Fragen darf ?



  • Zum Beispiel nen neueren von MS?

    Visual C++ 2005 Express ist z.B. kostenlos...



  • LÖL, jo hab ich auch...mal ausprobiert und damit gehts...KACK M$ is also echt n Bug...*grummel*...Naja der Compiler hat nur leider kein Resourceneditor...naja

    DAnk euch!


Anmelden zum Antworten