Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Nel Formula 1 Technology and Media Centre di Biggin Hill, la velocità delle monoposto si trasforma in dati, immagini e decisioni in tempo reale grazie all’infrastruttura Lenovo che gestisce centinaia di terabyte ogni weekend di gara e collega 820 milioni di spettatori nel mondo
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
Il nuovo gimbal mobile DJI evolve il concetto di tracciamento automatico con tre modalità diverse, un modulo multifunzionale con illuminazione integrata e controlli gestuali avanzati. Nel gimbal è anche presente un'asta telescopica da 215 mm con treppiede integrato, per un prodotto completo per content creator di ogni livello
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-03-2008, 15:42   #1
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
[C] Copiare file in una stringa

Ho fatto una semplice funzione per copiare il testo di un file in una stringa ma mi da errore quando lo eseguo, esce il solito errore di windows, "non inviare"... come mai?
Codice HTML:
#include <stdio.h>
#include <stdlib.h>

static char* readFile(FILE *  in){
       
/* Copia il file di input in una stringa e la restituisce. */
       
       char c=0;
       static char *s;
       
       while(c!=EOF){
                     
                     c=fgetc(in);
                     *s=c;
                     *s=*s+1;}
                     
       return s;}

int main(void){
    
    FILE *f1;
    static char *s;
    
    f1=fopen("prova.txt", "r");
    
    *s=readFile(f1);
    
    printf("%s\n", s);
    
    system("PAUSE");}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2008, 15:47   #2
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
perché all'interno di readFile non hai allocato s
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2008, 15:54   #3
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
in che senso? non capisco...
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2008, 16:10   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
in che senso? non capisco...
's' è una variabile static (vuol solo dire che è a durata "fissa", non è allocata sullo stack). Ma è un puntatore non inizializzato .... non si sa a cosa punta.
Devi prima fare in modo che 's' punti ad una area di memoria di dimensione sufficiente per quello che devi fare.

Anche la chiamata non va bene:
*s=readFile(f1);

L'asterisco non ci vuole.

E guardando meglio la funzione:
*s=*s+1;

non è tecnicamente sbagliato ma non ha molto senso (non so cosa volevi fare ... incrementare il puntatore?)
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2008, 16:15   #5
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
da quanto tempo andbin

allora ho tolto l'asterisco dove non andava bene...

con *s=*s+1 voglio incrementare la stringa, cioè passare alla locazione successiva dove memorizzare un carattere preso dal file. è sbagliato?

non capisco ancora come allocare s all'interno della funzione. devo usare malloc? se si come?
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2008, 16:50   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
con *s=*s+1 voglio incrementare la stringa, cioè passare alla locazione successiva dove memorizzare un carattere preso dal file. è sbagliato?
No non va bene. L'operatore di dereferenziazione * ha priorità maggiore del +, quindi prima prenderebbe il carattere puntato da s (es. 'a'), poi lo incrementa di 1 (diventa 'b') e poi lo assegna di nuovo nel carattere puntato da s.

Se vuoi incrementare il puntatore basta che fai s++;

In ogni caso leggere 1 byte per volta è inefficiente e scomodo. Meglio usare fread() per leggere un blocco di byte.

Quote:
Originariamente inviato da xbubbax Guarda i messaggi
non capisco ancora come allocare s all'interno della funzione. devo usare malloc? se si come?
Sì con malloc. Se non conosci a priori la dimensione del file, ci sono diversi scenari:
a) Aprire il file, fare una fseek() al fondo e determinare la lunghezza con ftell(), quindi fare una fseek() all'inizio. In tal caso si alloca un unico blocco di memoria che può già contenere l'intero file.
b) Allocare inizialmente un tot di memoria che poi viene riallocata man mano che serve facendo un ciclo di N letture.
c) Allocare un tot di memoria sufficientemente grande e leggere al massimo per quella dimensione, non di più.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2008, 16:53   #7
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
io ho sempre usato malloc solo con le liste, non ho idea di cosa inserire ora, cioè di come allocare memoria.

Codice HTML:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static char* readFile(FILE *  in){
       
/* Copia il file di input in una stringa e la restituisce. */
       
       char c=0;
       static char *s=(   )malloc(sizeof( ));
       
       while(c!=EOF){
                     c=fgetc(in);
                     *s=c;
                     s++;}                    
       return s;}

int main(void){
    
    FILE *f1;
    static char *s;
    
    f1=fopen("prova.txt", "r");
    
    s=readFile(f1);
    
    printf("%s\n", s);
    
    system("PAUSE");}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2008, 17:41   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
non ho idea di cosa inserire ora, cioè di come allocare memoria.
Ma è appunto lì la questione, ho anche spiegato le varie possibilità. Dipende tutto da come vuoi gestire il (ri)dimensionamento dell'area di memoria.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2008, 18:06   #9
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
sisi ho capito che vuoi dire, il problema mio è proprio scrivere le righe di codice, ovvero la sintassi. non ho mai usato quelle funzioni che hai nominato
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 09:56   #10
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
andbin dei modi che mi hai elencato per allocare memoria quale mi conviene usare?
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 10:57   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
andbin dei modi che mi hai elencato per allocare memoria quale mi conviene usare?
Io direi quella che ho indicato con a). Determini prima la dimensione del file, allochi memoria esattamente per quella dimensione e quindi carichi tutto il file.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 11:25   #12
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
Vada per la a. Sto cercando le funzioni che mi servono ma non ho idea di come usarle.

int fseek(FILE *stream, long offset, int whence);

long ftell(FILE *stream);

non so come usarle, non l'ìho mai fatto, mi puoi fare un esempio simile al mio...
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 12:04   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Ecco un esempio che avevo già scritto in passato:

Codice:
long get_file_size (FILE *stream)
{
    long pos, size;

    if ((pos = ftell (stream)) == -1)
        return -1;   /* errore */

    if (fseek (stream, 0, SEEK_END) != 0)
        return -1;   /* errore */

    if ((size = ftell (stream)) == -1)
        return -1;   /* errore */

    if (fseek (stream, pos, SEEK_SET) != 0)
        return -1;   /* errore */

    return size;
}
È molto "generica" perché si preoccupa di salvare/ripristinare la posizione corrente, qualunque essa sia.
Se non ti è chiaro, chiedi pure.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 13:11   #14
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
quindi se ho capito bene devo fare una funzione apposta per calcolare la lunghezza del file o posso includerla nella mia funzione?

una volta che ho fatto questo cosa devo assegnare al puntatore static char*s?

size? o cosa
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 13:42   #15
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
quindi se ho capito bene devo fare una funzione apposta per calcolare la lunghezza del file o posso includerla nella mia funzione?
Se vuoi usare la "mia" funzione così come è, basta che la metti ad esempio all'inizio del tuo sorgente.
L'ho postata perché capissi il concetto. Non sei obbligato ad usare la mia funzione, puoi anche solo chiamare le singole fseek/ftell dove ti servono. Basta che fai le 3 fasi indispensabili: a) sposti al fondo, b) leggi la lunghezza, c) sposti all'inizio.

Quote:
Originariamente inviato da xbubbax Guarda i messaggi
una volta che ho fatto questo cosa devo assegnare al puntatore static char*s?
La lunghezza ottenuta la passi a malloc, che ti dà un puntatore all'area allocata che poi assegni alla tua variabile puntatore.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 14:04   #16
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
in teoria dovrebbe venire una cosa del genere?

Codice HTML:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static char* readFile(FILE *  in){
       
/* Copia il file di input in una stringa e la restituisce. */

    long pos, size;
    char c=0;
    static char *s;

    if ((pos = ftell (in)) == -1)
        return -1;   /* errore */

    if (fseek (stream, 0, SEEK_END) != 0)
        return -1;   /* errore */

    if ((size = ftell (in)) == -1)
        return -1;   /* errore */

    if (fseek (stream, pos, SEEK_SET) != 0)
        return -1;   /* errore */

    s=malloc(sizeof(size));

       
       
       while(c!=EOF){
                     c=fgetc(in);
                     *s=c;
                     s++;}                    
       return s;}

int main(void){
    
    FILE *f1;
    static char *s;
    
    f1=fopen("prova.txt", "r");
    
    s=readFile(f1);
    
    printf("%s\n", s);
    
    system("PAUSE");}
però mi da errore sui vari return -1 dei tuoi if, penso perchè la mia funzione non deve ritornare un intero.
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 14:30   #17
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
in teoria dovrebbe venire una cosa del genere?
Concettualmente sì, salvo gli errori che tra poco ti riporto.

Quote:
Originariamente inviato da xbubbax Guarda i messaggi
Codice:
    if ((pos = ftell (in)) == -1)
        return -1;   /* errore */
La mia funzione ritorna un long, quindi per indicare errore ho fatto ritornare -1, che sicuramente non è una lunghezza valida.

Nella tua funzione non puoi far ritornare -1! Infatti restituisce un char*. Presta meglio attenzione alla gestione degli errori. Piuttosto fai ritornare NULL in caso di errore (e nel main dovrai ovviamente anche testarlo).

Quote:
Originariamente inviato da xbubbax Guarda i messaggi
s=malloc(sizeof(size));
sizeof fornisce la dimensione in byte di una variabile o un tipo, quindi non va bene. Visto che size è un long, sizeof(size) ritorna sempre 4 su un sistema a 32 bit!!

s=malloc(size);

Quote:
Originariamente inviato da xbubbax Guarda i messaggi
Codice:
       while(c!=EOF){
                     c=fgetc(in);
                     *s=c;
                     s++;}
Come avevo già detto, leggere un byte per volta è scomdo ed inefficiente. Usa fread().
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)

Ultima modifica di andbin : 13-03-2008 alle 14:33.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 14:46   #18
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ho corretto tutto ma mi da ancora errore.

per la fread basta sostituirla alla fgetc oppure devo includere qualche libreria?

Codice HTML:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static char* readFile(FILE *  in){
       
/* Copia il file di input in una stringa e la restituisce. */

    long pos, size;
    char c=0;
    static char *s;

    if ((pos = ftell (in)) == -1)
        return NULL;   /* errore */

    if (fseek (in, 0, SEEK_END) != 0)
        return NULL;   /* errore */

    if ((size = ftell (in)) == -1)
        return NULL;   /* errore */

    if (fseek (in, pos, SEEK_SET) != 0)
        return NULL;   /* errore */

    s=malloc(size);

       
       
       while(c!=EOF){
                     c=fgetc(in);
                     *s=c;
                     s++;}                    
       return s;}

int main(void){
    
    FILE *f1;
    static char *s;
    
    f1=fopen("prova.txt", "r");
    
    s=readFile(f1);
    
    printf("%s\n", s);
    
    system("PAUSE");}
    
   
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 14:57   #19
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
Codice:
    s=malloc(size);
       
       while(c!=EOF){
                     c=fgetc(in);
                     *s=c;
                     s++;}                    
       return s;}
Il valore di ritorno della malloc dovresti anche testarlo.

Non è sufficiente sostituire fread() a fgetc() sono due cose diverse. fread() è sempre in stdio come per fgetc/fseek/ftell.

Poi non ti sei reso conto di una cosa: nel ciclo incrementi il puntatore s e va bene. Ma poi alla fine restituisci proprio quello, che ormai punta dopo la fine del blocco di memoria!!!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 13-03-2008, 14:59   #20
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
quindi mi salvo la testa del puntatore pèrima di entrare nel while


e per quanto riguarda la malloc non ho capito che vuoi dire... ti riferisci al test nel main?
xbubbax è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce Recensione Pura 80 Pro: HUAWEI torna a stupire c...
Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
Snap e Perplexity unite: dal prossimo an...
La Cina dice addio a NVIDIA? Il governo ...
Microlino, simbolo italiano della mobili...
Apple disattiverà la sincronizzaz...
Google lancia l'allarme: attenzione ai m...
Primo test drive con Leapmotor B10: le c...
'Non può essere un robot': l'uman...
Monopattino elettrico Segway Ninebot Max...
Syberia Remastered è disponibile:...
Sony scopre che tutti i modelli AI hanno...
Amazon nasconde un -15% su 'Seconda Mano...
Due occasioni Apple su Amazon: iPhone 16...
Verso la fine della TV tradizionale? I g...
Cassa JBL a 39€, portatili, smartphone, ...
Cometa interstellare 3I/ATLAS: la sonda ...
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: 00:03.


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