|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
[C++] Incorporare file di testo dentro eseguibile
E' possibile compilare un programma in modo che incorpori al suo interno un determinato file (di testo) e fare in modo che durante l'esecuzione del programma lo utilizzi (ad es. per creare altri file che contengano il contenuto del file originale)?
Sarebbe comodo se uno volesse distribuire un programma senza allegarci altri file... quindi distribuendo solo l'exe... |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Dovrebbe essere possibile includere qualsiasi tipo di file in un exe attraverso il file .rc con questa sintassi:
Codice:
#define id 10 #define nome_risorsa 50 id nome_risorsa "path_relativa_della_risorsa" ID_HTML HTML "pagina.html" e poi puoi accederci tramite il protocollo res: Codice:
res://path_all'eseguibile/ID_HMTL Codice:
res://c:\\qualcosa.exe/ID_HMTL Codice:
FILE *fp; fp = fopen("res://c:\\qualcosa.exe/ID_FILEDITESTO", "r"); Ultima modifica di kk3z : 14-11-2005 alle 12:06. |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
mettiamo che io voglia incorporare un file di testo e poi nel programma devo solo copiare il contenuto di questo file dentro un altro che verrà creato dal programma stesso... è possibile farlo?
per quanto riguarda il codice che hai postato non ho capito molto... |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Una possibilità (non è l'unica comunque) per fare quello che chiedi potrebbe essere la seguente. Supponi di avere un file di testo con alcune righe del tipo: Prova1Se tu avessi un sorgente C/C++ del tipo: char miotesto[] =potresti usare la variabile miotesto come vuoi, per leggere, scrivere su file il testo, ecc... A questo punto puoi farti una piccola utility, anche a linea di comando, che dato un file di testo, ti crea un file C/C++ come sopra, poi includi il sorgente nel tuo progetto e usi la variabile come vuoi. Occhio solo ai caratteri, ad esempio se incontri un doppio apice " devi convertirlo in \" nel sorgente C/C++ generato.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
Ah ho capito cosa vuoi dire... però il file di testo che dovrei includere contiene una marea di caratteri tipo " ecc. che quindi andrebbero tutti "sistemati"... è un lavoraccio (tra l'altro abbastanza inutile credo...).
Se fosse possibile includerlo all'interno come detto da kk3z in modo da leggere e copiare in un altro file sarebbe molto piu veloce e comodo... ora cmq che ho un po' di tempo proverò i vari procedimenti, se avete altre proposte e soluzioni fatemele sapere! ![]()
__________________
ka0s |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
#include <stdio.h> int main (int argc, char *argv[]) { FILE *fi, *fo; int ch; long size = 0; if (argc == 4) { if ((fi = fopen (argv[1], "r")) != NULL) { if ((fo = fopen (argv[2], "w")) != NULL) { fprintf (fo, "char %s[] =\n\"", argv[3]); while ((ch = getc (fi)) != EOF) { if (ch == '"' || ch == '\\') putc ('\\', fo); putc (ch, fo); size++; } fprintf (fo, "\";\n"); fprintf (fo, "long %s_size = %ld;", argv[3], size); fclose (fo); } fclose (fi); } } return 0; } nome-utility prova.txt prova.c miotestoChiaramente dai il nome tu alla utility come vuoi! Io l'ho già provato, funziona benissimo e con qualunque carattere. E, nota, ti crea pure una variabile "long" con la lunghezza del testo. Poi vedi tu. Ciao.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
Wow!! veramente notevole!! grazie mille!!! Adesso proverò ad includerlo in un progetto e vedere come mi funziona
![]() PS: non è che mi spieghersti (sempre se ti va ed hai tempo chiaramente) abbastanza dettagliatamente il sorgente che mi hai postato? Dato che non riesco a capirlo nella sua interezza... mi faresti un favore almeno so con cosa lavoro ![]() PPS: ehm scusa la domanda banale: nel mio file sorgente devo mettere #include <nomefile.c> (che ho creato con il prog. che hai postato tu) e poi come faccio a richiamare il char miotesto[]=".." ??
__________________
ka0s Ultima modifica di ka0s : 16-11-2005 alle 16:50. |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Quote:
|
|
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Il programma controlla prima il numero di parametri, poi apre con la fopen i due file (uno in lettura e l'altro in scrittura naturalmente). Dopodiché scrive la dichiarazione della variabile e inizia il ciclo di lettura carattere per carattere. Non è sicuramente ottimizzato ma come esempio va bene. Nel ciclo, viene letto un carattere per volta con la getc dal file di testo fino a quando si raggiunge l'end of file (EOF). Ogni carattere viene scritto in output pari pari, con l'unico fatto che il doppio apice e il backslash vengono preceduti da un backslash che funge da "escape". Il ciclo poi si chiude e viene scritta la fine della dichiarazione più una nuova dichiarazione con la lunghezza del testo (l'ho messa perché può sempre tornare utile). Alla fine vengono chiusi gli stream dei file. Se c'è qualcosa di più specifico del sorgente che non ti è chiaro chiedi pure, non c'è problema. Naturalmente il programma si può migliorare (inserendo la gestione degli errori) e anche ottimizzare dal punto di vista delle prestazioni. Quote:
La soluzione più pulita ed elegante comunque è quella di compilare il sorgente generato (in modo da ottenere un file oggetto da linkare insieme al resto della tua applicazione) e mettere, nel sorgente dove ti serve la variabile, un "extern char miotesto[];"
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
Grazie per la spiegazione
![]() Per quanto riguarda il resto... mi sento un po' stupido :P non riesco a fargli usare il char miotesto come vorrei... se uso #include <nomefile.h> non me lo trova... il compilatore mi dice: "No such file or directory" eppure c'è... ![]() Dato che cmq l'altro procedimento che mi hai indicato lo ritieni migliore ho provato anche quello... ma come faccio a compilarlo come file oggetto? (uso dev-cpp). E inoltre, una volta ottenuto questo file, come faccio a linkarlo insieme al resto del programma? Scusa le domande banali ma queste cose proprio non le so... nel frattempo cmq ci provo da solo ![]()
__________________
ka0s |
![]() |
![]() |
![]() |
#11 | ||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
#include <file.h> oppure #include "file.h" La differenza è che nel primo caso il compilatore cerca il file nei path specificati nella configurazione dell'ambiente di sviluppo (tipicamente include di sistema e include di librerie di terze parti) mentre nel secondo caso il file viene cercato a partire dal path dove risiede il sorgente che si sta compilando. Quote:
![]() Con il gcc è semplice. Esempio: Compilazione: gcc -c -o file1.o file1.c gcc -c -o file2.o file2.c ecc... Link: gcc -o eseguibile file1.o file2.o ecc....
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
||
![]() |
![]() |
![]() |
#12 | ||
Member
Iscritto dal: Nov 2005
Messaggi: 151
|
Quote:
![]() Quote:
![]()
__________________
ka0s |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:21.