Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
NXTPAPER 60 Ultra è il primo smartphone con tecnologia NXTPAPER 4.0 per il display, un ampio IPS da 7,2 pollici. Con finitura anti-riflesso, processore MediaTek Dimensity 7400, fotocamera periscopica e modalità Max Ink per il detox digitale, NXTPAPER 60 Ultra punta a essere il riferimento tra gli smartphone pensati per il benessere degli occhi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-06-2011, 13: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, 14: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, 15: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, 16: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, 17: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, 17: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, 18: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, 18: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, 19: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, 15: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, 15: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, 15: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, 16: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, 16: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, 17: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


Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
The Social Reckoning: il seguito di The ...
iPhone 16 si trova ora su Amazon a soli ...
Amazon fa a pezzi i prezzi dei monitor g...
Componenti hardware e periferiche PC a p...
Pianeta in crisi: 7 su 9 limiti vitali g...
Galaxy S25 FE con taglio di prezzo di 10...
4 robot aspirapolvere e 3 scope elettric...
Nuovissimi Xiaomi 15T e 15T Pro con tagl...
Le agenzie federali americane potranno u...
Smartphone pieghevoli sempre più ...
LG svela le Easy TV, una nuova gamma di ...
L'equipaggio della missione Shenzhou-20 ...
Possibili detriti spaziali del razzo cin...
Amazon distrugge i prezzi: TV OLED LG, i...
Trump studia dazi fino al 100% per sping...
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:12.


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