Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Usare fwrite per un vettore di caratteri
Forum - C/C++ - Usare fwrite per un vettore di caratteri - Pagina 2

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 20:15
Venerdì, 26/06/2009
in effetti il tuo approccio non è ottimale...

dovresti anteporre un header nel file. Qualcosa del genere:

Codice sorgente - presumibilmente C/C++

  1. struct _header {
  2.     int    numOfStrings;
  3.     int    descriptorsOffset;
  4. };



dopo questo header, seguiranno "numOfStrings" pacchetti, ciascuno dei quali rappresenta un descriptor (un oggetto contenente i dati per recuperare le informazioni cercate):

Codice sorgente - presumibilmente C++

  1. struct _stringDescriptor {
  2.     int    stringID;
  3.     int    size;
  4.     int    offset;
  5. };



in coda metterai tutte le stringhe, concatenate e unite da uno o più caratteri nulli.

In fase di recupero dei dati procederai in questo modo:

- Devo recuperare la stringa numero 23 (per esempio)
- Leggo l'header tramite fread, passando come parametro un puntatore ad una variabile di tipo struct
- Dalla struct appena letta, ricavo il numero delle stringhe contenute nel file
- Controllo se l'ID da me cercato è inferiore al numero totale di stringhe, in caso contrario c'è stato un errore
- Se l'ID è verosimile, recupero il descriptor numero 23 effettuando una seek sul file (l'offset lo calcolo così : offset = (header.descriptorsOffset + sizeof(stringDescriptor) * 23) )
- Leggo il descriptor
- Controllo se descriptor.stringID == 23 (in caso contrario il file è corrotto)
- Se tutto va bene, faccio una seek usando come offset descriptor.offset
- Leggo (finalmente) la stringa cercata con fread, usando come dimensione descriptor.size
- chiudo il file
- libero la memoria occupata dai descriptor allocati


è tutto :)

con questa tecnica si realizzano i language pack dei videogiochi... ad ogni frase si associa un ID univoco, si crea un file per ogni lingua e ogni volta che bisogna caricare una frase si effettua questa procedura :D

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 4:23
Sabato, 27/06/2009
Oppure implementare un automa a stati finiti quando vado a utilizzare fread. OK grazie TheKane, vedo cosa combino..

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 10:58
Martedì, 30/06/2009
Scrivendo cosi'

char *stringa[DIM];

allochi solamente 100 puntatori per le tue stringhe, non le 100 stringhe.

Devi allocare ogni stringa prima di utilizzarne il puntatore.

Come sempre, prima di orientarsi verso una soluzione, e' necessario avere chiari i termini della questione.

Le tue necessita' esatte quali sono? Ovvero

1) le tue 100 stringhe possono avere lunghezza variabile ?

2) devi scrivere del codice che le scrive tutte e le legge tutte o devi fare una ricerca?

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 11:30
Martedì, 30/06/2009
Eh, ricordi la gets? Io non voglio dare la dimensione di quante stringhe... quindi? Pure qui dovrei per forza dare una dimensione al vettore di stringhe? Avevo provato ad allocarle prima, ma senza successo..
Per la seconda questione, dovrei scrivere e leggerle in modalità binaria.

Ultima modifica effettuata da Lawliet il 30/06/2009 alle 11:37
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 11:36
Martedì, 30/06/2009
Testo quotato

Postato originariamente da Lawliet:

Eh, ricordi la gets? Io non voglio dare la dimensione di quante stringhe... quindi?



No ... non ricordo specificamente ... cosa c'entra la gets con 100 stringhe di lunghezza variabile?

Devi inserire una stringa di cui non conosci la lunghezza ? Beh, dichiarane una da 8K (sarà sicuramente sufficiente) e usala ...

Altrimenti, spiega meglio...

Testo quotato


Per la seconda questione, dovrei scrivere e leggerle in modalità binaria.



A questa domanda si puo' rispondere solo dopo che si sara' chiarito il tipo di struttura dati utilizzata per contenere le stringhe.

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 11:49
Martedì, 30/06/2009
Tempo fa postai, una questione sulla gets che avevo problemi perchè non avevo dichiarato la dimensione di una stringa.
Qui invece è simile, a differenza che non ho dichiarato la dimensione al vettore con la lunghezza stringa fissa.

E poi hai detto di dichiarare una da 8k. Ma se non volessi dichiararla, ma far assumere la dimensione dopo l'esecuzione del programma... si può?

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 12:11
Martedì, 30/06/2009
Puoi allocare dinamicamente la memoria che intendi utilizzare per una stringa con la malloc.

Hai provato?

PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 12:16
Martedì, 30/06/2009
C'avevo provato ad alloccare stringa per stringa, ma non ha funzionato. Perchè nella lettura, non riesce a fermarsi. Forse ho sbagliato io ad allocare.

PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo