Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
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


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Un gruppo di ladri ha usato Google Maps ...
Apple non si fida di Samsung per la real...
Windows 11: un nuovo driver nativo mette...
Vi hanno regalato buoni Amazon? Intanto ...
Via acari, polvere e sporco da materassi...
Cuffie Beats in super offerta su Amazon,...
Xbox Cloud Gaming arriva su Amazon Fire ...
Un blackout a San Francisco manda in til...
Windows 11 è diventato più...
Apple cambia strategia a causa della cri...
007 First Light: uscita rimandata di due...
Samsung Galaxy A37 e A57: il comparto fo...
DAZN lancia la sua offerta di Natale: My...
Gigabyte fa marcia indietro? Sparito il ...
Alcuni rivenditori giapponesi bloccano l...
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: 11:50.


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