Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
Analizzare file di testo in C
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 07 Set 2008 10:46    Oggetto: ouch! Rispondi citando

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
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 07 Set 2008 18:21    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 08 Set 2008 11:37    Oggetto: Rispondi citando

Ma getline() è nella libreria standard? In ogni caso, non è portabile, giusto?
Top
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 24 Set 2008 21:56    Oggetto: da file di testo a struct...in c Rispondi citando

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: Question
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
Profilo Invia messaggio privato
chemicalbit
Dio maturo
Dio maturo


Registrato: 01/04/05 18:59
Messaggi: 18597
Residenza: Milano

MessaggioInviato: 24 Set 2008 23:01    Oggetto: Re: da file di testo a struct...in c Rispondi citando

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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 25 Set 2008 08:18    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
chemicalbit
Dio maturo
Dio maturo


Registrato: 01/04/05 18:59
Messaggi: 18597
Residenza: Milano

MessaggioInviato: 26 Set 2008 21:24    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 27 Set 2008 08:20    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
chemicalbit
Dio maturo
Dio maturo


Registrato: 01/04/05 18:59
Messaggi: 18597
Residenza: Milano

MessaggioInviato: 27 Set 2008 10:13    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 27 Set 2008 10:23    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
chemicalbit
Dio maturo
Dio maturo


Registrato: 01/04/05 18:59
Messaggi: 18597
Residenza: Milano

MessaggioInviato: 27 Set 2008 10:26    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 27 Set 2008 11:40    Oggetto: Rispondi citando

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... Rolling Eyes

(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
Profilo Invia messaggio privato
chemicalbit
Dio maturo
Dio maturo


Registrato: 01/04/05 18:59
Messaggi: 18597
Residenza: Milano

MessaggioInviato: 27 Set 2008 20:56    Oggetto: Rispondi citando

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... Rolling Eyes
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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 30 Set 2008 09:14    Oggetto: Rispondi

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
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi