Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Abbiamo provato per diversi giorni una new entry del mercato italiano, la Gowow Ori, una moto elettrica da off-road, omologata anche per la strada, che sfrutta una pendrive USB per cambiare radicalmente le sue prestazioni
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design
OnePlus 15 nasce per alzare l'asticella delle prestazioni e del gaming mobile. Ma non solo, visto che integra un display LTPO 1,5K a 165 Hz, OxygenOS 16 con funzioni AI integrate e un comparto foto con tre moduli da 50 MP al posteriore. La batteria da 7.300 mAh con SUPERVOOC 120 W e AIRVOOC 50 W è la ciliegina sulla torta per uno smartphone che promette di offrire un'esperienza d'uso senza alcun compromesso
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media
Vediamo come si comporta il Ryzen 5 7500X3D, nuovo processore di casa AMD che fonde 6 core Zen 4 con la tecnologia 3D V-Cache, particolarmente utile in scenari come il gaming. Annunciato a un prezzo di listino di 279€, il nuovo arrivato sarà in grado di diventare un riferimento per i sistemi budget? Ecco cosa ne pensiamo.
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


Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media AMD Ryzen 5 7500X3D: la nuova CPU da gaming con ...
SONY BRAVIA 8 II e BRAVIA Theatre System 6: il cinema a casa in formato compatto SONY BRAVIA 8 II e BRAVIA Theatre System 6: il c...
KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo KTC H27E6 a 300Hz e 1ms: come i rivali ma a met&...
4,9 miliardi su Google: Buffett sfida il...
Google ha svelato un agente AI che può g...
Tesla cambia idea: è in arrivo l'...
Anche Firefox punta sull'intelligenza ar...
Stop alle super-accelerazioni delle auto...
Osservatorio AGCOM: sempre più ac...
Sempre più IA su Spotify: arrivan...
iMac M4 crolla a 1.199€ con risparmio di...
Nintendo Switch 2: in rilascio un nuovo ...
Core Ultra 9 290K Plus, Core Ultra 7 270...
Prezzo Black Friday per le super cuffie ...
Crollano i prezzi della cuffie Beats col...
ASUS ROG Matrix RTX 5090 costa 4000 doll...
Grazie ai dati di ESA il calcolo della t...
Rilasciati nuovi video e immagini della ...
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: 03:07.


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