Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-11-2005, 12:35   #1
ka0s
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...
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 14-11-2005, 13:03   #2
kk3z
Senior Member
 
L'Avatar di kk3z
 
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"
come per esempio

ID_HTML HTML "pagina.html"

e poi puoi accederci tramite il protocollo res:
Codice:
res://path_all'eseguibile/ID_HMTL
come per esempio

Codice:
res://c:\\qualcosa.exe/ID_HMTL
dovrebbe essere possibile quindi qualcosa del genere
Codice:
FILE *fp;
fp = fopen("res://c:\\qualcosa.exe/ID_FILEDITESTO", "r");
chiaramente non credo tu ci possa scrivere dentro..

Ultima modifica di kk3z : 14-11-2005 alle 13:06.
kk3z è offline   Rispondi citando il messaggio o parte di esso
Old 14-11-2005, 19:00   #3
ka0s
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...
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2005, 11:18   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ka0s
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...
Hai parlato di C++ e di exe, quindi suppongo che tu stia sviluppando una applicazione in Windows con questo linguaggio.
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:
Prova1
Prova2
Prova3
Se tu avessi un sorgente C/C++ del tipo:
char miotesto[] =
"Prova1
Prova2
Prova3";
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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2005, 12:00   #5
ka0s
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
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2005, 14:47   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ka0s
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!
Beh, no ... dai! Un lavoraccio proprio no! Se vuoi ti posto un esempio semplice e minimale per fare una utility, come ti ho spiegato già prima, per convertire un file di testo in un sorgente C/C++:

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;
}
Lo compili e poi lo usi con 3 parametri:
nome-utility prova.txt prova.c miotesto
Chiaramente 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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2005, 17:37   #7
ka0s
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 17:50.
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2005, 18:28   #8
kk3z
Senior Member
 
L'Avatar di kk3z
 
Iscritto dal: Nov 2003
Messaggi: 980
Quote:
Originariamente inviato da ka0s
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...
Usi un ide? Che compilatore usi? Hai familiarità con i progetti?
kk3z è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2005, 20:54   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ka0s
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
Certo che posso spiegartelo. Il programma accetta 3 parametri, il nome del file di testo in input, il nome del file sorgente da generare e il nome della variabile da usare. Potendo specificare anche il nome della variabile, l'ho reso più generico, nel caso uno volesse avere più blocchi di testo in una applicazione (dovendo quindi usare nomi diversi).
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:
Originariamente inviato da ka0s
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[]=".." ??
Beh, se il sorgente generato lo usi solo in un altro sorgente, puoi certamente usare la direttiva include. Usa solo l'estensione .h. In genere non è bello mettere #include "file.c".
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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2005, 21:40   #10
ka0s
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
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2005, 22:20   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ka0s
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'è...
Esistono due modi per specificare un file di include:

#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:
Originariamente inviato da ka0s
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
Il dev-cpp lo conosco solo di nome ... non l'ho mai usato.
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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2005, 23:10   #12
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
Quote:
Esistono due modi per specificare un file di include:

#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.
Ah già lo sapevo pure...


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....
grazie mille!
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Record per l'energia eolica: nel Regno U...
Dell e HP rimuovono la codifica e transc...
Prezzo eccezionale per Samsung Galaxy S2...
Black Friday esplosivo: arrivano extra s...
Google apre la strada al file sharing tr...
Black Friday Monitor 2025: OLED, QD-OLED...
Arrivano le nuove specifiche Matter 1.5:...
Microsoft rende open source la trilogia ...
DAZN continua la lotta contro la pirater...
Generativa o predittiva? Il futuro dell’...
BYD va all-in con la Atto 2: batteria pi...
Google modifica la richiesta di consenso...
Black Friday TV: OLED, QLED e Mini-LED a...
007 First Light torna a mostrarsi all'ev...
MOVA Z60 Ultra Roller Complete: il Black...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:48.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v