Precedente :: Successivo |
Autore |
Messaggio |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 07 Set 2008 10:46 Oggetto: ouch! |
|
|
srand(time(NULL)+num_giocatori )
lancio = rand()%6 +1
Questo problema è passato in secondo piano visto che ora ne ho un altro che mi annebbia il resto....
-------------------------------
ho un file di config (txt) che viene puntato da un campo della struct "gioco".
Da tale file devo prelevare ogni riga 1 volta, per inizializzare 2 campi della struct casella: un intero e una stringa.
mi sto definendo una f.ne di conversione da:
num_casella:prova_associata a=> int num char*prova
ad esempio la riga:
...
12:combattere con hulk
...
mi deve diventare
int num_cas= 12
char *prova= "combattere con hulk"
Pensavo di scrivermi la f.ne di conversione passandogli un int e un char*, prelevare i valori dalla riga del file e modificare i parametri con tali valori.... ma.... così modifico solo la copia locale delle var nello stack oppure quando vado a rileggere tali valori, una volta uscita dalla f.ne di conversione sono stati modificati??? Forse l'unica è che la f.ne li converta e li inserisca lei stessa nella struct...che ne dite?
Ma ancora peggio...
Devo tenere il segno di dove sono arrivata nel file (con fseek(), fsetpos(),...)oppure c'è una scappatoia???
Per andare di riga in riga e non di carattere in carattere, quanto deve valere offset di fseek() o pos di fsetpos()??? |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 07 Set 2008 18:21 Oggetto: |
|
|
Se i parametri formali della funzione sono puntatori o referenze, le modifiche dei loro valori si ripercuotano sulle var passate (parametri attuali). Nel tuo caso il char* è a posto, l'altro parametro dovrà essere un int*.
In un file ascii ti conviene mantenere la posizione della riga con una var a parte; tu non sai quanto è lunga una riga quindi sarebbe un casino giocare con fseek etc... (secondo me).
Per il tuo problema non credo ti serva andare avanti e indietro nel file quindi se le righe le leggi con fgets o con getline, sei a posto.
Fai in modo di leggere una sola volta il file di configurazione e portare tutto in memoria perchè così non diventi matta tutte le volte ad andare a cercare le cose nel file. |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 08 Set 2008 11:37 Oggetto: |
|
|
Ma getline() è nella libreria standard? In ogni caso, non è portabile, giusto? |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 24 Set 2008 21:56 Oggetto: da file di testo a struct...in c |
|
|
Buonasera a tutti,
Ho un dubbio...
ho un file di testo le cui righe(num:stringa) mi servono ad inizializzare una struct, la mia funzione di inizializzazione funziona bene nel caso in cui le righe siano ordinate ma mi sto chiedendo... e se non lo sono?
Mi conviene:
I) inserire una chiamata system(sort mio_file.txt) (<-lecito?)
o comunque ordinare il file prima di usarlo
II) fare l'inserimento "ordinatamente"?
Perchè il fatto di inserire ordinatamente mi obbliga a cercare la riga giusta nel file... mi sembra un po' macchinoso... |
|
Top |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 24 Set 2008 23:01 Oggetto: Re: da file di testo a struct...in c |
|
|
saetta ha scritto: | Buonasera a tutti,
Ho un dubbio...
ho un file di testo le cui righe(num:stringa) mi servono ad inizializzare una struct, | Num cos'è?
Chi genera quei file, il tuo stesso programma? |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 25 Set 2008 08:18 Oggetto: |
|
|
num è un numero:, il file è fatto così:
0:aaa
1:bbb
2:jjj
...
no il file non è generato dal mio programma, viene dato da utente, ma pensavo di dare la possibilità di modificarlo quando il programma si accorge che c'è un errore o manca qualcosa.
comunque ho implementato l'inserimento ordinato senza problemi, (dato che ho una lista di struct) |
|
Top |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 26 Set 2008 21:24 Oggetto: |
|
|
saetta ha scritto: | num è un numero:, il file è fatto così:
0:aaa
1:bbb
2:jjj
... | E il numero indica in quale "campo" della struct devi inserirlo?
saetta ha scritto: | no il file non è generato dal mio programma, viene dato da utente, ma pensavo di dare la possibilità di modificarlo quando il programma si accorge che c'è un errore o manca qualcosa. | allora sì,
devi fare in modo che il programma perlomeno controlli che sia tutto giusto.
(cioè non puoi dare per sontato che il file sia giusto).
p.s. separo in un'altra discussione i messaggi sul "saltare le righe vuote".
L'ultima modifica di chemicalbit il 27 Set 2008 10:09, modificato 1 volta |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 27 Set 2008 08:20 Oggetto: |
|
|
num viene messo nel campo num della struct e ciò che viene dopo i ':' viene messo nel campo string della struct
Codice: | typedef struct a
{
int num;
...
char * string;
...
} |
va bene anche se scrivo una f.ne per controllare in quale caso ricade la riga (vuota ma non ultima, solo numeri, solo testo....riga giusta...) è che non riesco a valutare correttamente quando una riga è vuota...
Grazie.
ps. ma dove devo postare senza far casino? |
|
Top |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 27 Set 2008 10:13 Oggetto: |
|
|
Ah, io avevo capito un'altra cosa.
Quindi ogni riga è una struct, e ogni struct è ccostituita da due elemento (un numerointero e una stringa)? |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 27 Set 2008 10:23 Oggetto: |
|
|
ogni riga non è una struct ma la uso per inizializzare una struct:
10:stringa che dice qualcosa
mi inizializza una struct con
Codice: | struct
{
num = 10
stringa =" stringa che dice qualcosa"
..
altri campi
...
} | .
poi ci sono altri campi che però non vengono inizializzati da file (non interessano a questo scopo) |
|
Top |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 27 Set 2008 10:26 Oggetto: |
|
|
Ma tu carichi una riga, quella che ti serve al moemnto, per riempire una struct,
e poi quando ti serviranno i valori diun'altra riga ripeterai l'operaizone;
o carichi in memoria tutte le righe (in varie struct -ad es. a loro volta raggruppate in un vettore, di struct, come dicevi qui)?
Perchè devi ordinare prima il file (ad s. chiamando "sort" con una chiamata disistema, come dicevi tu)? |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 27 Set 2008 11:40 Oggetto: |
|
|
per ora faccio così per prendere una riga
Codice: |
if(fgets(s, 100, fc) == NULL ) //perchè fgets ritorna null per un errore o se siamo alla fine del file.
{
return -1;
}
|
questo lo fa una mia funzione (prendiriga(int *n, char *s) ) che ritorna un int ma modifica i suoi parametri n ed s con il contenuto della riga già diviso(int e string), questi contenuti vengono presi e usati x inizializzare la struct(num e string) che viene inserita in base al suo numero in lista (inserimento ordinato)<--Quindi non ordino prima il file e leggo una riga per volta... avevo avuto un'idea stupida nel post a cui ti riferisci...
(l'array è di un' altro tipo di struct, dello stesso programma... qui un'array sarebbe veramente stupido)
Citazione: |
Ma tu carichi una riga, quella che ti serve al moemnto, per riempire una struct,
e poi quando ti serviranno i valori diun'altra riga ripeterai l'operaizone;
|
certo che lo faccio, ma come faccio se nel file c'è una riga vuota e dopo invece ce ne sono altre da leggere???
Come posso dirgli:
"Non fidarti se trovi una riga vuota, se non sei alla fine del file probalbilmente ce ne saranno altre che devi leggere dopo!!!" |
|
Top |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 27 Set 2008 20:56 Oggetto: |
|
|
saetta ha scritto: | questo lo fa una mia funzione (prendiriga(int *n, char *s) ) che ritorna un int ma modifica i suoi parametri n ed s con il contenuto della riga già diviso(int e string), questi contenuti vengono presi e usati x inizializzare la struct(num e string) che viene inserita in base al suo numero in lista (inserimento ordinato)<--Quindi non ordino prima il file e leggo una riga per volta... avevo avuto un'idea stupida nel post a cui ti riferisci... | Fin qui c'ero,
quello che non capisco è la varibile struct(num e string) che inizializzi è sempre la stessa (perchè ce n'è una sola)
o in base al valore che hai letto nel file (e che hai messo in int n) inzializzi una variabile struct piuttosto che un'altra?
saetta ha scritto: | certo che lo faccio, ma come faccio se nel file c'è una riga vuota e dopo invece ce ne sono altre da leggere???
Come posso dirgli:
"Non fidarti se trovi una riga vuota, se non sei alla fine del file probalbilmente ce ne saranno altre che devi leggere dopo!!!" | Ma fgets si "ferma" ( = ritorna NULL ) anche se trova una riga vuota? (che formalmente vuota non è, visto che contiene \n)
O solo se è effettivamente alla fine del file? |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 30 Set 2008 09:14 Oggetto: |
|
|
ogni volta che leggo una riga alloco una struct nuova, la riempo coi valori della riga e la inserisco in lista.
fgets legge al più n-1 caratteri dal file fp e li pone nell'array line.
La lettura è interrotta se s'incontra una newline (\n) o la fine del file; se la fine del file viene incontrata all'inizio della lettura, il contenuto di line non viene modificato e si restituisce null, altrimenti restittuisce line
PROTOTIPO:
char *fgets(char *line, int n, FILE *fp) |
|
Top |
|
 |
|