Torna indietro   Hardware Upgrade Forum > Software > Programmazione

BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone
BOOX ha portato sul mercato Picco, un e-reader da 3,97 pollici che pesa 58 grammi e si aggancia al retro dello smartphone con un anello magnetico. Lo abbiamo usato con Pixel 11 Pro XL e iPhone 18 Pro per capire se un formato così ridotto regga la prova della lettura quotidiana
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max mette un pannello IPS da 13 pollici con risoluzione 2,5K e refresh a 120 Hz davanti a una batteria da 10.100 mAh e a quattro altoparlanti. Il listino parte da 399,90 euro, per un progetto molto chiaro e ambizioso: schermo ampio, buon audio e giornate lontano dalla presa, a un prezzo che non pesa sul portafoglio
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-06-2011, 14:57   #1
Robbiez
Junior Member
 
Iscritto dal: Aug 2009
Messaggi: 10
linguaggio C - Una mano per un semplice problema di lettura file - un aiuto?

Un ciao a tutta la popolazione di HArdware Upgrade.

Il mio problema è abbastanza semplice:

vorrei leggere un file dal primo all'ultimo byte, e inserire gli elementi letti in un vettore unidimensionale, così che ogni elemento del vettore sia un byte del file...ad esempio vorrei ottenere una cosa di questo tipo (sotto c'è l'inizio di un file jpeg preso da un tool apposito di lettura file, in cui i byte sono espressi in esadecimale)

int fileScansionato[]={0xFF,0xD8,0xFF,0xE0,0x00,0x10,0x4A,0x46,0x49,0x4 6,0x00,0x01,0x01,0x01......}

Ho letto molte guide sulla lettura/scrittura di file di testo o binari, senza trovare la soluzione!
utilizzando la funzione fread, o funzioni analoghe ho qualche problema, anche perchè non conosco la dimensione del file e quindi quella del vettore che devo creare!inoltre gli elementi del vettore risultano sballati, forse perchè a me interessano i byte "effettivi" del file...Ad esempio nel file jpeg che sto analizzando, il file è di 563 byte , ma l'occupazione su disco è di 4 KB...

Aggiungo che sono sotto mac os x e uso xcode come compilatore.


Sarei grato a chiunque voglia darmi una dritta...Sono nelle vostre mani!
Grazie e saluti!
Robbiez è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2011, 15:21   #2
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
se vuoi leggerlo tutto devi vedere prima quanto è grande, allocare un array abbastanza grande e leggere tutto con fread

però la libreria c non mi pare ti dia un modo per vedere la dimensione del file, quindi dovresti usare altri modi (ad esempio su mac os puoi usare la stat)

detto questo, fai prima mappando il file in memoria (su mac os puoi farlo con mmap)
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2011, 16:45   #3
Robbiez
Junior Member
 
Iscritto dal: Aug 2009
Messaggi: 10
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
se vuoi leggerlo tutto devi vedere prima quanto è grande, allocare un array abbastanza grande e leggere tutto con fread

però la libreria c non mi pare ti dia un modo per vedere la dimensione del file, quindi dovresti usare altri modi (ad esempio su mac os puoi usare la stat)

detto questo, fai prima mappando il file in memoria (su mac os puoi farlo con mmap)
Grazie per la risposta! però ho alcuni "ma"...

1)anche conoscendo la dimensione esatta del file in byte (leggendola dalle proprietà del file) gli elementi del vettore restituito sono costituiti da 4 byte e non da un byte come richiesto nella fread.

2)ottengo comunque dei valori "sballati": ad esempio se leggo i primi 10 elementi del file ottengo un risultato, e se leggo i primi 20 ne ottengo altri.

Per chiarezza posto il codice che ho usato:

#include <stdio.h>

int main (int argc, const char * argv[]) {

FILE *PuntFile;
int dimensione=563;
int dati[dimensione];
int kap;

PuntFile=fopen("sediciperSS.jpg","rb");


if(PuntFile==NULL)
printf("ERRORE NELL'APERTURA DEL FILE\n\n");
else
{
printf("\n\nFILE CARICATO CORRETTAMENTE");
kap=fread(dati,1,dimensione,PuntFile);
printf("\nNumero di valori effettivamente letti: %d\n",kap);

printf("vettore letto:\n");
for (int i=0;i<dimensione;i++){
printf("%x ",dati[i]);
}

}
fclose(PuntFile);
return 0;

}

Il risultato è che Kap (valori letti effettivamente) è zero....anche se di norma dovrebbe essere pari a dimensione (563), inoltre nella stampa del vettore dati, questo è errato....

Per quanto riguarda il discorso legato alla dimensione del file, penso che sia incredibile che non sia possibile con la libreria standard determinare la lunghezza del file...

Continuo a ringraziare chiunque per qualsiasi delucidazione...
Adesso do un occhiata a mmap per vedere se potrebbe aiutare in qualche modo
Robbiez è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2011, 17:20   #4
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
il problema allora è che la fread ti ritorna 0 e non riesce a leggere nessun byte, onestamente a guardare il codice non me lo saprei spiegare a dire il vero, c'è qualche motivo particolare per cui quel file non possa essere letto? (tipo, su mac os x, visto che non ne so niente, i lock sono mandatory? non è che il file è lockato da qualche programma? è strano onestamente che non riesca a leggerlo una volta aperto)
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2011, 18:23   #5
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Prima di tutto con questo puoi risalire alla dimensione del file da leggere

Codice:
FILE *f = fopen(...);
fseek(f, 0, SEEK_END);
long l = ftello(f);
inoltre con fread puoi avere i blocchi della dimensione che ritieni più opportuno dato che
Codice:
fread(puntatore al buffer, dimensione del blocco, numero di blocchi da leggere, puntatore al file)
se tu metti
Codice:
fread(dati,1,dimensione,PuntFile);
è ovvio che viene tutto sballato perchè tu leggi 1 byte 563 volte e va bene, ma non va veramente bene perchè il tuo buffer dati si aspetta che 1 solo blocco valga 4 byte!

Quindi morale della favola cambia dati da tipo intero a char!

edit:
penso si capisca che "dati" è il tuo buffer
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2011, 18:48   #6
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Quote:
Originariamente inviato da clockover Guarda i messaggi
se tu metti
Codice:
fread(dati,1,dimensione,PuntFile);
è ovvio che viene tutto sballato perchè tu leggi 1 byte 563 volte e va bene, ma non va veramente bene perchè il tuo buffer dati si aspetta che 1 solo blocco valga 4 byte!
se ha allocato un array di int da 563.. gli "avanzerà" e chiaramente è sballato nella stampa, e dovrebbe usare char o, meglio, unsigned char, però non è una giustificazione per il fatto che kap è uguale a 0 quando lo stampa
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2011, 19:12   #7
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Be di sicuro c'è altro che non va...ad esempio che cosa vuol dire "rb" come secondo parametro della fopen? non mi risulta nessuna b dalla documentazione


poi sempre a Robbiez indenta il codice che ci aiuti ad aiutarti
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2011, 19:51   #8
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
b è binary
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2011, 20:37   #9
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
b è binary
a si ok l'ho trovato
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2011, 16:24   #10
Robbiez
Junior Member
 
Iscritto dal: Aug 2009
Messaggi: 10
grazie per le risposte!
DAvvero mille grazie!
Anzi 3E8 grazie (in esadecimale)a clockover e tucciò!

adesso analizzo bene bene quanto avete scritto....
Intanto posso fare un paio di considerazioni:

il codice postato era corretto,ovvero:
io utilizzo xcode, e in sostanza cambiando il tipo di progetto, funziona perfettamente....Sono passato da un progetto command line C ad un progetto Iphone...e il kap improvvisamente era corretto, così come la scansione del file(ho fatto il copia/incolla del mio codice) . Chissà il perchè...

Non sono comunque riuscito ad avere nel mio vettore dati, elementi da 1 byte, ma sempre da 4 byte, ma poco male perchè ho fatto una funzioncina che separa i singoli byte, sfruttando le proprietà del sistema numerico esadecimale
ad esempio a partire dall'elemento dell'array FFD81AF5, crea 4 elementi {FF,D8,1A,F5}...

Il problema resta per adesso solo quello di capire la dimensione del file...A tal proposito sto seguendo i vostri suggerimenti,
e sarei grato a chiunque abbia qualche altro suggerimento per cercare di estrarre in maniera semplice la dimensione, in byte, di un qualsiasi file (ovviamente sfruttando la libreria standard del c)

Ci lavoro un'altro po su..e vediamo che ne esce.

Grazie ancora
Robbiez è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2011, 16:31   #11
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da Robbiez Guarda i messaggi
Il problema resta per adesso solo quello di capire la dimensione del file...
guarda che te l'ho scritto come ricavarti la dimensione del file
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2011, 16:40   #12
Robbiez
Junior Member
 
Iscritto dal: Aug 2009
Messaggi: 10
Quote:
Originariamente inviato da clockover Guarda i messaggi
guarda che te l'ho scritto come ricavarti la dimensione del file
si si ho visto (ancora grazie), ci stavo proprio ora, lavorando su...
Robbiez è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2011, 17:32   #13
Robbiez
Junior Member
 
Iscritto dal: Aug 2009
Messaggi: 10
Ricapitolando, nel mio codice utilizzo prima

FILE *f = fopen(...);
fseek(f, 0, SEEK_END);
long l = ftello(f)

per valutare la dimensione del file.

In seguito però devo rifare fopen(...) prima di fare fread, altrimenti la fread non funziona, qualcuno sa spiegarmi il perchè?
Robbiez è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2011, 17:37   #14
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
perchè se fai fseek impostando SEEK_END vai alla fine del file...

dopo che ti sei trovato la dimensione del file dai
Codice:
rewind(filePointer);
che è del tutto equivalente a
Codice:
fseek(filePointer, 0, SEEK_SET)
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2011, 18:20   #15
Robbiez
Junior Member
 
Iscritto dal: Aug 2009
Messaggi: 10
Quote:
Originariamente inviato da clockover Guarda i messaggi
perchè se fai fseek impostando SEEK_END vai alla fine del file...

dopo che ti sei trovato la dimensione del file dai
Codice:
rewind(filePointer);
che è del tutto equivalente a
Codice:
fseek(filePointer, 0, SEEK_SET)
Perfetto, capito perfettamente!

ti ringrazio tantissimo per l'aiuto,infinitamente!
e spero che questi post siano prima o poi di aiuto a qualcun'altro!
Robbiez è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


BOOX Picco: l'ebook reader minuscolo è una genialata, e si può attaccare allo smartphone BOOX Picco: l'ebook reader minuscolo è un...
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
La missione ESA Hera inizia l'analisi de...
SpaceX e Singulus: stretto un accordo pe...
Binance avvisa: un bug di iOS mette a ri...
Apple corregge 9 vulnerabilità su iPhone...
Microsoft inaugura il Pavilion a Roma, c...
Black Friday, l'errore che può co...
Lotus avrà un V8 ibrido da 670 CV...
IBM: solo il 26% delle imprese dimostra ...
Hacker contro hacker e danni per 740.000...
Xiaomi SkyNomad, boom da 27.147 auto in ...
Logitech concede un giorno di ferie ai s...
Amazon, questi mini PC hanno un display ...
BYD prepara una rivale di smart #2? Il b...
Amazon, 3 robot tagliaerba ECOVACS GOAT ...
La cifratura di WhatsApp e Signal funzio...
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: 22:37.


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