Dateien in die auszuführende Datei einfügen.



  • Hallo Zusammen,

    ich habe ein Programm geschrieben welches in seinem Verlauf auf eine binäre Datei zugreift. Dies geschiet im Algorythmus durch Angabe des Pfades.

    Um das Programm Benutzerfreundlicher zu machen wäre es schön wenn man sich um diese extzerne Datei nicht mehr kümmern müsste und diese in der auszuführenden Datei integriert wäre!

    habt ihr so etwas schon mal gemacht, bzw. wisst ob so etwas möglich ist?

    Gruß,

    Lin



  • Da gibt es eine ganze Reihe Moeglichkeiten und keine davon hat eigentlich etwas mit "ANSI C" zu tun.

    Am einfachsten waere sicher, du packst die Datei in das selbe Verzeichnis wie dein Programm und oeffnest sie dann nur durch Angabe des Dateinamens.

    Windows bietet ansonsten die Moeglichkeit recht komfortabel mehrere Dateien als "Ressourcen" an ein Programm anzuhaengen und zu deren Verwaltung auch eigene Funktionen (Win-API).

    Als letztes fiele mir noch ein, unter genauer Einhaltung einer Reihenfolge beim Linken ans Ende einer Datei ein Label zu packen und die gewuenschte Binaerdatei direkt hinten dran zu linken. Auf diese Weise solltest du wie auf ein Array auf die Datei zugreifen koennen.



  • lin123 schrieb:

    habt ihr so etwas schon mal gemacht, bzw. wisst ob so etwas möglich ist?

    ja und ja. 🙂
    gruß, w.



  • Nobuo T schrieb:

    Da gibt es eine ganze Reihe Moeglichkeiten und keine davon hat eigentlich etwas mit "ANSI C" zu tun.

    warum nicht.

    @lin123
    du kannst die datei als headerdatei in einer char* variable verpacken und sie dem programm dazulinken.



  • @Nobuo T
    es hat was mit Ansi C zu tun weil ich bei diesem Projekt mit ansi C arbeite.

    Klar, datei in das gleiche Verzeichniss tun geht immer! Das Programm soll aber überall ausführbar sein ohne daß diese Datei überallhin mitgeschleppt werden muss!

    Wie kann ich die Datei hinten dran linken? (ich arbeite unter linux mit GCC)

    @wisser++
    Die Datei als headerdatei zu verpacken klingt elegant! Wie sieht das komkret aus?



  • Wie kann ich die Datei hinten dran linken? (ich arbeite unter linux mit GCC)

    Wozu der ganze Blödsinn? Schreib das Ding in ein char-Array und siehe da: du wirst es im binary haben.
    Oder übergib den Pfad als Argument.
    Oder leg die Datei in das jeweilige Userverzeichnis.
    Oder dorthin, wo sie sein sollte, wenn sie global ist (siehe LFS).

    du kannst die datei als headerdatei in einer char* variable verpacken und sie dem programm dazulinken.

    Wie zum Teufel soll ich denn Header linken? Linken kann ich Objekte udgl.



  • µngbd schrieb:

    Wie zum Teufel soll ich denn Header linken? Linken kann ich Objekte udgl.

    lies dir meine antwort ruhig noch einmal durch, vllt. verstehst du das dann.



  • Oder dorthin, wo sie sein sollte, wenn sie global ist (siehe LFS).

    Es war doch FHS (für Filesystem Hierarchy Standard). Aber das hat mit ANSI wirklich wenig zu tun.



  • @lin123
    Hallo,
    was ist das für eine Datei? Wäre es nicht einfacher die Daten, wenn es nicht sooo viele sind, diese in Variablen im Programm zu speichern?



  • Ganz einfach

    // datei.h
    
    extern char const * const datei;
    
    // datei.c
    
    char const * const datei = "Inhalt der Datei...";
    
    // main.c
    
    #include "datei.h"
    
    int main() {
      do_sth(datei);
    }
    

    und um eine Datei in einen String umzuwandeln kannst du dir ein einfaches Programm zusammen basteln. Das habe ich zB mal geschrieben

    #include <stdio.h>
    
    void escape(char const *file) {
      FILE *fh = fopen(file, "r");
      if(!fh) {
        perror("fopen");
        return;
      }
      printf("char const *const %s = \"", file);
      enum { BufferSize = 1024 };
      char buffer[BufferSize];
      size_t bytes;
      while( (bytes = fread(buffer, 1, BufferSize, fh)) ) {
        for(size_t i = 0; i < bytes; ++i) {
          printf("\\x%02X", buffer[i]);
        }
      }
      puts("\";");
    }
    
    int main(int argc, char **argv) {
      if(argc < 2) {
        printf("usage: %s <file> ...\n", *argv);
        return 1;
      }
    
      for(int i = 1; i < argc; ++i) {
        escape(argv[i]);
      }
    }
    


  • char const * const datei = "Inhalt der Datei...";
    

    Das ist wohl die einfachste Variante. Du bist aber auf eine maximale Groesse beschraenkt.



  • Big Brother schrieb:

    @lin123
    Hallo,
    was ist das für eine Datei? Wäre es nicht einfacher die Daten, wenn es nicht sooo viele sind, diese in Variablen im Programm zu speichern?

    Es handelt sich um eine Binäre datei welche eine Bibliothek beinhaltet (etwa 10 Mb groß!)

    was ich gerade versuche ist folgendes:
    1 zeichen in datei zählen
    2 char *datei[anzahlzeichen];
    3 datei öffnen
    4 for (i=0; i<anzahlzeichen;i++){
    datei[i]=(char)getc(DATEI);}

    bin mir nicht sicher ob das so klappt...



  • Das würde ich lieber in einer separaten Datei lassen.
    Das lässt sich leichter handhaben und bläht nicht unnötig
    das Programm auf.



  • 10 MB ist schon eine Bibliothek von einer Bibliothek 🕶

    Sind es Daten nimm eine Datenbank. Ist es Code müßte es schon das
    halbe Kernel sein ...



  • 10 MB ist doch in der heutigen Zeit nicht viel, also dafür brauchst du keine Datenbank. Es ist völlig in Ordnung wenn du eine Datei anhängst die die Größe eines Emailanhanges haben könnte.



  • Das würde ich lieber in einer separaten Datei lassen.

    Ich auch. Am Ende will noch jemand die Datei verändern...



  • lin123 schrieb:

    bin mir nicht sicher ob das so klappt...

    Ich auch nicht, vor allem frage ich mich gerade wie du die
    Bibliothek benutzen willst, wenn sie in einem char* string
    gekapselt ist.



  • ch auch nicht, vor allem frage ich mich gerade wie du die
    Bibliothek benutzen willst, wenn sie in einem char* string
    gekapselt ist.

    Na, 8 Bit processing ... :p



  • Scheppertreiber schrieb:

    ch auch nicht, vor allem frage ich mich gerade wie du die
    Bibliothek benutzen willst, wenn sie in einem char* string
    gekapselt ist.

    Na, 8 Bit processing ... :p

    Ich stelle mir gerade vor es handelte sich um eine Bibliothek a la
    my_lib.lib, die man dem Linker verklickert und mit #include "my_lib.h" einbindet.

    Aber da bin ich wohl nicht mehr up to date.
    :p



  • so, ich bin hier ein bisschen weiter gekommen!
    also das Programm geht, aber leider immernoch mit dem verweis auf die externe Datei mithilfe der pfad angabe.

    Zur Zeit geht es folgendermaßen

    void funktion(char pfad[200]){
    ....
    char *LIB = pfad; // Pfad zu der Bibliothek
    ...
    }
    

    Hier kommt die Baustelle: Weil die auszuführende Datei diese Bibliothek beinhalten soll, habe ich versucht die komplette Datei in einem char array abzuspeichern.

    char* save_lib(char xxx[200]){
    	printf("save_lib\n");
    	int c = 0;
    	int i = 0;
    	int numchar = 0;
    	FILE * pFile;
    	pFile=fopen (xxx,"r");
    	if (pFile==NULL) perror ("Error opening file");
    	else
    	{
    	  do {
    	    c = fgetc (pFile);
    	    numchar++;
    	  } while (c != EOF);
    	}
    	printf("number of char: %i ",numchar);
    	//const int size = numchar;
    	const int size = 155697;
    	char lib[size];
    	rewind(pFile);
    	for (i=0;i<size;i++) lib[i]=(char)fgetc(pFile);
    	fclose(pFile); 
    	return(lib);
    }
    ....
    void funktion(char pfad[200]){
    ....
    //char *LIB = pfad; // Pfad zu der Bibliothek
    char *LIB = save_lib(pfad);
    ...
    }
    

    Erstens bezweifle ich dass Zeile 28 und 29 auf das gleiche hinauslaufen.
    Zweitens wäre es schön wenn die Länge meines char arrays dynamisch festgelegt werden könnte...
    freue mich auf eure Tipps!
    Gruß,
    Lin



  • Wenn du auf Unix und im Zweifel bist, dann man dir einen Ordner in /opt. Dort darfst du machen, was du willst. Also die große Datei dorthin.

    Bleibt das Problem, wie man den Pfad aus dem Code herausbekommt. Man könnte den zB bei jedem Aufruf als Command-Line-Argument mitgeben. Schlauer ist es wahrscheinlich, eine (kleine) Konfigurationsdatei anzulegen, in der der Pfad steht, und also auch vom User/Administrator verändert werden kann. Also diese Datei ins Userverzeichnis oder in ein globales Verzeichnis, aber dann so, daß man die Konfigurationsdatei vom Binary mit einem relativen Pfad erreicht. So würde ich das auf den ersten Blick machen. Ich hab natürlich bemerkt, daß du das Ding im Binary haben willst, aber das ist wahrscheinlich eine schlechte Sache.

    Erstens bezweifle ich dass Zeile 28 und 29 auf das gleiche hinauslaufen.

    Wahrscheinlich tun sie das nicht. Aber mir ist schleierhaft, was save_lib() eigentlich tun soll.

    Zweitens wäre es schön wenn die Länge meines char arrays dynamisch festgelegt werden könnte...

    Dann mach statt einem Array einen Zeiger auf char, und gib ihm gleich angangs Speicher mit man: malloc.


Anmelden zum Antworten