Textdatei in Projekt?



  • Hello again,

    ist es möglich, eine .txt Datei in ein Projekt einzubinden, und dann auch darauf zuzugreifen?
    Das einbinden ist einfach :), aber dann die Daten auslesen???

    Geht darum, dass in dieser Datei div. Angaben stehen, z. B. Versionsnummer, die immer aktualisiert werden, aber nicht als extra Datei mitgeliefert werden sollen.

    grüssle 🙂



  • Die Windows API bietet da einige Funktionen, guck dir mal FindResource, LoadResource, LockResource und SizeOfResource an.



  • Also, entweder ein Ressourcen Skript verwenden wie DocShoe geschrieben hat, oder einfach aus deiner Textdatei eine Headerdatei machen und dort die Werte als #define anlegen lasssen.

    Ich hoffe es ist verständlich was ich meine.



  • Hallo

    Stephan schrieb:

    Also, entweder ein Ressourcen Skript verwenden wie DocShoe geschrieben hat, oder einfach aus deiner Textdatei eine Headerdatei machen und dort die Werte als #define anlegen lasssen.

    Bitte nicht als define, sondern als echte typisierte Konstanten!

    bis bald
    Stefan



  • Also ich bevorzuge defines, da diese auch in einem Ressourceskript verwendet werden können 😃

    MfG Stephan



  • n'Morgen,

    Header höhrt sich sehr gut an, nur wie?

    Die Textdatei wird im Builder beim Pre-Build aus einem Subversion Repos. erstellt. Also mit 'svn info ...'

    Muss wohl mal suchen, wie ich die Ausgabe von svn info zu einer .H Datei "formatieren" kann.

    Besten Dank & grüssle 🙂

    :schland: :schland: :schland:
    ... und jetzte ein Käsebrötchen 🙂
    :schland: :schland: :schland:



  • Also ich erstell mir immer ein "Template" mit Schlüsselwörtern und laß dann im Postbuild (bzw hab teilweise MsBuild Tasks erstellt) die Schlüsselwörter ersetzen.
    Das einfachste wäre hier ein Skriptsprache und reguläre Ausdrücke zu verwenden.
    Eventuell kann dir auch SubWCRev.exe für SVN weiterhelfen.

    MfG Stephan



  • Auslesen kann man jede Datei und natürlich auch eine Textdatei. Du fragst nach den Inhalten der Datei. Das weiss allein derjenige, der die Datei erstellt hat. Wenn er es dir nicht sagt, musst du es raten oder es lassen!



  • Sodele, habs jetzt so gelöst:

    in der .rc Datei:

    TAB_TXT RCDATA "\\version.txt"
    

    und im Code, beim App Start:

    HRSRC hRes;
    		HRSRC hMem;
    		int sz_info;
    
    		hRes = FindResource(NULL, "TAB_TXT",  RT_RCDATA );
    		if ( hRes != NULL)
    		{
    			// Resource laden
    			hMem = (HRSRC)LoadResource(NULL, hRes);
    			sz_info = SizeofResource(NULL, hRes);
    
    			TResourceStream* mstream = new TResourceStream((int)HInstance, L"TAB_TXT", MAKEINTRESOURCEW(10));
    			mstream->Position = 0;
    			sl->LoadFromStream( mstream ); // Inhalt der Textdatei
    			delete mstream;
    		}
    		for( i = 0; i < sl->Count; i++ )
    		{
    			...
    

    muss jetzt nur aufpassen, dass die .rc Datei bei jeder Änderung der version.txt auch neu erstellt wird, da die Änderung der Textdatei nicht erkannt wird.

    Für bessere / elegantere / ... Lösungen bin ich immer empfänglich 🙂

    grüssle 🙂



  • Smitty schrieb:

    muss jetzt nur aufpassen, dass die .rc Datei bei jeder Änderung der version.txt auch neu erstellt wird, da die Änderung der Textdatei nicht erkannt wird.

    Du könntest ins Pre-Build-Event "touch <filename>.rc" oder sowas eintragen.

    Smitty schrieb:

    Für bessere / elegantere / ... Lösungen bin ich immer empfänglich 🙂

    Die Lösung ist gut, nur mußt du try/__finally oder std::auto_ptr<> für deinen TResourceStream benutzen, sonst potentielles Speicherleck.


Anmelden zum Antworten