Externe Daten direkt in die EXE linken



  • Ich habe viele einzelne .txt-Dateien, die ich gerne zur Programmlaufzeit gerne direkt in Variablen haben möchte, etwa in char-Arrays.

    Da die txt-Dateien häufig ändern, möchte ich nicht jedesmal manuell den Text in den Source kopieren, die Syntax anpassen und dann neu compilieren, sondern einfach neu compilieren und fertig...

    etwa in diesem Stil stelle ich mir das vor:

    {
        char    file1[] = #loadfile(c:\txtfile1.txt)
        char    file2[] = #loadfile(c:\txtfile2.txt)
    }
    

    gibt es keine direktiven oder irgend eine möglichkeit das zu bewerkstelligen?

    Wäre echt praktisch.
    - Adrian



  • Für Windows-Executables gibts das System der Resources.

    Gruß



  • Danke schon mal für die Antwort. Eigentlich hätte man da ja auch selbst drauf kommen können.
    Hmm, ich benutze Borland C++ Builder. Wie macht man hier am Besten solche Ressourcen Dateien? Mit zusätzlichen Tools? Oder was wäre da vorgesehen?
    - Adrian



  • am besten mal im borland builder unterforum hier im forum recherchieren.



  • hab selber zwar noch nie was mit Resourcen gemacht,
    aber ich kann mir trotzdem nicht vorstellen, dass es was bringt,
    wenn man eine Textdatei, in eine exe reinlinkt???

    Sobald sich das Original ändert hat man doch wieder die falschen Daten.

    Ein simples std::ifstream-Objekt sollte doch hier ausreichen.

    Oder hab ich da was falsch verstanden?

    #include <fstream>
    #include <iostream>
    
    bool loadFile(const std::string & File, std::string & Target);
    
    int main()
    {
    std::string fileContent;
    
    	if (loadFile("test.cpp", fileContent) == false)
    	{
    	// fehler
    	}
    
    std::cout<<fileContent<<std::endl;
    
    return 0;
    }
    
    bool loadFile(const std::string & File, std::string & Target)
    {
    std::ifstream fin;
    fin.open(File.c_str());
    
    	if (! fin.good())
    	{return false;}
    
    bool eof = false;
    
    	while (! eof)
    	{
    	char c;
    	fin.get(c);
    
    		if (fin.eof())
    		{break;}
    
    	Target += c;
    	}
    
    fin.close();
    
    return true;
    }
    


  • falsch verstanden

    ja! Der Witz ist natürlich der, dass man die .txt (oder allgemeine) Dateien nicht mit der Exe ausliefern muss, sondern das die Daten AllInOne, das heisst eben gleich in der Exe mit drinne sind. Klar, wie gesagt, wenn die originale ändern, muss man halt das Projekt neu compilieren.

    - Adrian



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum VCL/CLX (Borland C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.





  • ja! Der Witz ist natürlich der, dass man die .txt (oder allgemeine) Dateien nicht mit der Exe ausliefern muss, sondern das die Daten AllInOne, das heisst eben gleich in der Exe mit drinne sind.

    Fein, warum sind sie dann überhaupt in einer EXE? Warum nicht dann direkt als "Variable" im Programm??

    Ansonsten schau dir mal
    TStringList und dort LoadFromFile & LoadFrom Stream an



  • Warum nicht dann direkt als "Variable" im Programm

    Na weil ich eben nicht jedesmal, wenn in der .txt-Datei was ändert diese als Variable in den Source kopieren will. Klar das könnte ich auch, aber das ist bei X Ressourcen eben viel zu mühsam wenn man es anders haben kann.

    Und warum TStringList.LoadFromFile(..) nicht interessant ist, ist aus demselben Grund wie oben schon erwähnt: Weil ich die txt-Dateien nicht separat mit der exe mitgeben will, sondern alles in einer Datei sprich in der EXE drinn sein soll...

    - Adrian



  • Sorry, aber umständlicher geht es wohl kaum noch:

    Na weil ich eben nicht jedesmal, wenn in der .txt-Datei was ändert diese als Variable in den Source kopieren will.

    Aber deswegen die ganze Anwendung neu compilieren. Dann schau unter

    LoadStr lädt eine Stringressource aus der ausführbaren Datei einer Anwendung.

    Unit

    SysUtils

    Kategorie

    Sonstige Routinen

    extern PACKAGE AnsiString __fastcall LoadStr(int Ident);

    Beschreibung

    LoadStr lädt die mit Ident angegebene String-Ressource aus der ausführbaren Programmdatei oder einer freigegebenen Bibliothek. Ist die String-Ressource nicht vorhanden, gibt LoadStr einen leeren String zurück.

    Durch Auslagern der auf dem Bildschirm angezeigten Strings in Ressourcen kann eine Anwendung an andere Landessprachen angepaßt werden, ohne daß der Programmcode geändert werden muß.



  • LoadStr lädt eine Stringressource aus der ausführbaren Datei einer Anwendung.

    Genau. Da sind wir ja wieder bei den Ressourcen... Und was meinst Du, wie kommen die in die Exe-Datei rein? - Die muss man auch reinlinken! Und wenn die Ressourcen ändern, muss man die EXE neu compilieren bzw. neu linken. Das heisst schlussendlich schlägst Du mir genau das vor, was ich ja möchte und wo von wir schon lange diskutieren - Ressourcen in eine EXE-Datei einbinden...

    Ich hoffe wir verstehen uns jetzt, sonst lassen wir es doch einfach, bevor es ein hitziges hin und her gibt... Ich werde mich noch schlau machen, was für Möglichkeiten es für BCB gibt, die Ressourcen zu verwalten und dann sind wir alle happy! 🙂
    Danke für die Hilfe!

    - Adrian



  • Ähhh. sorry, hellsehen kann ich nicht und nochmal sorry, aber bei einer solchen "ungewöhnlichen" Anwendungsweise brauch man vielleicht etwas. Üblicherweise nutzt man diese Technik für Mehrsprachigkeit. Es gibt andere Resourceneditoren, die Stringresourcen erstellen und verwalten , wie dieser http://www.sicomponents.com/rbldr2.html

    Der BCB hat keine Tools um Stringresourcen zu erstellen oder verwalten. Ist auch nicht nötig, ein einfacher Texteditor reicht dazu aus.

    Und was meinst Du, wie kommen die in die Exe-Datei rein?

    Ich meine dazu nix, weil ich weiss wie die da reinkommen -> www.google.de -> http://delphi.about.com/library/weekly/aa011805a.htm Das was da für Delphi erklärt wird trifft auch für BCB zu.



  • http://www.wilsonc.demon.co.uk/d6peresourceeditor.htm Da gibt es ein Freeware Resource Editor der Stringtables kann.



  • Danke für Deine Hilfe. Ich werde es versuchen sobald ich Zeit habe...
    ...Jetzt muss ich erst mals noch eine Woche ins Militär... bis später!

    - Adrian



  • Ich darf nochmal auf meinen Link auf der ersten Seite dieses Threads hinweisen ...


Anmelden zum Antworten