Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 29-01-2018, 19:10   #1
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
[C++] leggere file strutturato

ciao,
ho un file "strutturato" ricavato da una apparecchiatura che è formato da alcuni caratteri di controllo BEL/ESC e da caratteri ascii nel range, per intenderci, stampabili sullo schermo, insomma: ha una sorta di header.

La prima idea che mi è venuta è stata quella di leggere 1 carattere alla volta e in presenza di un carattere di controllo, comportarsi di conseguenza. Il problema è che richede un certo numero di if().

Se non ricordo male, è possibile dichiarare un struttura e riempirla con una sola chiamata; ricordo male?

Esempio di struttura:

Codice:
struct misurazione
{
   char NomeCostruttore[20];
   char CaratteriDiControllo[2];
   char NomeApparato[20];
   char Data[20];
   char AltraStringa[20];
};
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2018, 08:38   #2
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
grazie,
ho trovato la fread() che mi consente di leggere un certo numero di byte e riempire la struttura in base al suo sizeof(struct ...)

Il caos ora è costruire la struttura nel modo corretto in quanto non ho documentazione disponibile.



Codice:
struct misurazione
{
   char NomeCostruttore[20];
   char CaratteriDiControllo[2];
   char NomeApparato[20];
   char Data[20];
   char AltraStringa[20];
};

struct misurazione input;

fread(&input, sizeof(struct misurazione), 1, fp);
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2018, 09:56   #3
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
la fread non va bene, fread e' per lettura di file binari. A te interessa lettura di file testuali (se ho capito correttamente), quindi lettura formattata. (fscanf(), sscanf(), etc)
il file contiene anche caratteri non stampabili, ecco perché sto provando la fread().

Quello che mi interessa è una funzione che mi riempie i membri della mia struttura in funzione delle dimensioni dei suoi membri.

struct persona
{
char nome[20];
char cognome[20];
int età;
};

nel caso della struttura persone, con una sola chiamata la tal funzione dovrebbe assegnare i primi 20 byte del file al nome, i successivi 20 byte al cognome etc.
Questa strada mi è sembrata la migliore in quanto se dovessero modificare il file, disallineando quindi qualche campo di qualche byte, mi basterebbe modificare la struttura per sistemare le cose e non toccare altro.


p.s.
se interessa a qualcuno http://faculty.winthrop.edu/dannelly..._record_IO.htm

Ultima modifica di misterx : 30-01-2018 alle 10:21.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2018, 10:29   #4
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
ma quindi non e' un file di testo? nel primo messaggio parli di caratteri ASCII.. cosa intendi? se un file binario si, devi leggere con fread. e poi spezzare i byte letti nei singoli campi delle tue strutture.
è un file misto
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2018, 13:08   #5
Mursey
Senior Member
 
L'Avatar di Mursey
 
Iscritto dal: Aug 2017
Messaggi: 469
Quote:
Originariamente inviato da misterx Guarda i messaggi
è un file misto
Visto che non esiste il file misto, puoi mica postarne un frammento dentro tag CODE ?
Mursey è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2018, 16:49   #6
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
Quote:
Originariamente inviato da Mursey Guarda i messaggi
Visto che non esiste il file misto, puoi mica postarne un frammento dentro tag CODE ?
il file a mio giudizio non è importante in quanto poi, ho un'altra apparecchiatura che produce un file completamente diverso e quindi dovrei riadattare il codice. Desidero creare un sorgente adattabile con poche modifiche.
La mia idea è popolare una struttura in un qualche modo attraverso una funzione standard che la riempia; la fread, anche se pensata per leggere dati raw, potrebbe andarmi bene e qualche risultato lo sto vedendo.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2018, 18:22   #7
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
se leggi i dati in formato binario, l'unica cosa che puoi popolare e' un buffer di memoria, e poi devi reinterpretare i dati letti. occhio a mischiare i due approcci.
per me l'argomento è di interesse quindi pongo il seguente esempio come quesito: supponiamo di avere un file ignoto che inizia con due byte tipo ascii(7)BEL ed ascii(27)ESC, poi 30 byte in caratteri stampabili, quindi altri 2 byte ascii(7) ed ascii(27), poi altri 25 caratteri stampabili etc....

Totale byte da leggere=2+30+2+25=59 byte

Se dichiaro una struttura del tipo:

struct MiaStruct
{
char PrimiDueByte[2];
char PrimoDato[30];
char SecondiDueByte[2];
char SecondoDato[25];
}

struct MiaStruct input;

fread (&input, sizeof(struct MiaStruct), 1, infile);

la fread(), per quale ragione non funzionerebbe?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2018, 18:45   #8
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
in questo caso "funziona" semplicemente perche' effettivamente stai riempiendo un buffer di memoria (quella struct e' una collezione di array di bytes). Nota che lo standard C non dovrebbe raccomandare alcuna dimensione per il char, tant'e' che alcune macchine possono aver char a 7 bit (vecchie macchine), o DSP con char a 10 bit, etc.

Supponi di voler fare la stessa cosa ma uno dei campi e' un intero? come risolveresti?

si interponessi un int, non verrebbero letti 4 byte?

esempio:

struct MiaStruct
{
char PrimiDueByte[2];
char PrimoDato[30];
int PrimoDatoIntero;
char SecondiDueByte[2];
char SecondoDato[25];
}

struct MiaStruct input;

fread (&input, sizeof(struct MiaStruct), 1, infile);

alla fine dovrei leggere 63 byte, almeno credo.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2018, 18:57   #9
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
in quel caso continua a funzionare perche' il compilatore non inserisce nessun padding prima dell'intero, ma se per esempio prima dell'intero avessi 33 byte, non sarebbe piu' garantito. inoltre, se hai un numero salvato in formato ASCII? dovresti comunque prevedere un modo per interpretare i bit e salvarli in int, etc.

sei stato molto chiaro
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2018, 19:12   #10
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
per concludere, con la fread() potrei avere un disallineamento di bit e finire per leggere altri byte che nulla hanno a che vedere con l'informazione originaria, è corretto?
Credo cge se così fosse, dimostrerebbe perchè ci si trova in presenza di caratteri "spuri" durante la lettura di un file.

Mi chiedevo anche: ma un file di testo in puro ascii non dovrebbe soffrire di disallineamenti di bit e quindi con la fread non dovrei mai avere il problema di caratteri spuri, o c'è dell'altro?
misterx è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
La crisi dei PC è peggiore del pr...
Alibaba pronta a vietare Claude Code ai ...
Sovranità sui dati: Cloud Firewal...
FiberCop porterà la fibra Gigabit...
Data center in Lombardia: 20 progetti sc...
Tutti i modi in cui la scommessa di Orac...
Kioxia e SanDisk sbandierano i numeri de...
iPhone 18 Pro potrebbe usare modem Qualc...
Basta 'AI slop': Godot vieta ufficialmen...
Un annuncio sponsorizzato su X diffonde ...
Data center in Italia: l’IA spinge la de...
Sam Altman afferma che l'IA 'rimodeller&...
Samsung Galaxy Glasses, un video trapela...
Data center orbitali; Musk promette l'IA...
Hasselblad e Capture One fanno pace: i R...
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: 16:04.


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