Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Le novità ASUS per il 2026 nel settore dei PC desktop
Le novità ASUS per il 2026 nel settore dei PC desktop
Molte le novità anticipate da ASUS per il 2026 al CES di Las Vegas: da schede madri per processori AMD Ryzen top di gamma a chassis e ventole, passando per i kit di raffreddamento all in one integrati sino a una nuova scheda video GeForce RTX 5090. In sottofondo il tema dell'intelligenza artificiale con una workstation molto potente per installazioni non in datacenter
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


Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
OnePlus non si ferma più: c'&egra...
DAZN sconta il piano Full per 6 mesi, se...
L'uso dell'IA nei giochi è cancer...
Meta punta sul nucleare USA per alimenta...
Le migliori offerte Amazon del weekend: ...
La crisi dell'hardware spinge i negozi g...
Apple Watch SE 3 scontato su Amazon: il ...
Robot aspirapolvere davvero scontati: si...
DDR5 troppo cara: il passato di AMD potr...
5 sconti TOP nuovi di zecca e altre offe...
Il più venduto e apprezzato: ECOV...
Era e resta un super top di gamma: il TV...
DOOGEE T10 Pro, il miglior tablet di tut...
Il miglior deumidificatore su Amazon sce...
Prosegue lo sviluppo del telescopio spaz...
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: 13:28.


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