Torna indietro   Hardware Upgrade Forum > Software > Programmazione

realme GT7: un "flaghsip killer" concreto! La recensione
realme GT7: un "flaghsip killer" concreto! La recensione
Abbiamo provato l'ultimo smartphone di realme, il nuovo GT7. Si tratta di un device che si colloca in una fascia di mercato delicata, ovvero quella che possiamo definire medio-alta. La specifica che salta all'occhio è senza dubbio la sua batteria da 7.000 mAh e un design elegante e premium. Ma come funziona nel quotidiano? E soprattutto è davvero un Flagship Killer? Ve lo diciamo nella nostra recensione completa.
Oracle guida Stargate UAE: nasce il supercluster per l'IA sovrana
Oracle guida Stargate UAE: nasce il supercluster per l'IA sovrana
Il cloud ottimizzato per l'intelligenza artificiale di Oracle si combina con un'infrastruttura per la sovranità sul dato negli Emirati Arabi. "Questa implementazione epocale stabilisce un nuovo standard per la sovranità digitale", afferma Larry Ellison, fondatore di Oracle
Tutto sulla nuova Tesla Model Y: autonomia in autostrada, prova bagagliaio e dettagli
Tutto sulla nuova Tesla Model Y: autonomia in autostrada, prova bagagliaio e dettagli
Abbiamo guidato per diversi giorni la nuova Tesla Model Y, in versione di lancio dual motor e con batteria long range. Ecco tutto quello che c'è da sapere sull'erede dell'auto più venduta al mondo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-11-2005, 11: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, 12: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 12:06.
kk3z è offline   Rispondi citando il messaggio o parte di esso
Old 14-11-2005, 18: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, 10: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, 11: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, 13: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, 16: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 16:50.
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2005, 17: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, 19: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, 20: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, 21: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, 22: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


realme GT7: un "flaghsip killer" concreto! La recensione realme GT7: un "flaghsip killer" concr...
Oracle guida Stargate UAE: nasce il supercluster per l'IA sovrana Oracle guida Stargate UAE: nasce il supercluster...
Tutto sulla nuova Tesla Model Y: autonomia in autostrada, prova bagagliaio e dettagli Tutto sulla nuova Tesla Model Y: autonomia in au...
HONOR 400 Pro trasforma ogni scatto in capolavoro animato. Recensione HONOR 400 Pro trasforma ogni scatto in capolavor...
Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU Arrow Lake per la fascia media Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU ...
SpaceX ha eseguito il nono volo del razz...
Tesla in caduta libera: in Europa -52,6%...
WhatsApp arriva finalmente su iPad: abbi...
Sony annuncia il ritorno dei proiettori ...
Concept Astro, il progetto di Dell per a...
Dubai pronta a offrire accesso gratuito ...
PlayStation Portatile: SoC AMD con proce...
Tor Alva: ecco l'edificio più alto al mo...
Finale di Champions con un maxischermo: ...
OnePlus AI: la nuova era dell'intelligen...
TeamViewer ONE: la piattaforma per unifi...
Volkswagen blinda l'architettura SSP: pr...
Sapphire Phantomlink: il produttore cine...
Formula E pronta a Shanghai: due gare de...
Offerte Tech da urlo: le componenti perf...
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: 04:21.


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