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
Saltare righe vuote da un file di testo che si sta leggendo
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: 26 Set 2008 10:58    Oggetto: Saltare righe vuote da un file di testo che si sta leggendo Rispondi citando

Se voglio prelevare le righe di un file di testo, saltando quelle vuote (ovvero cercando la successiva non vuota fino alla fine del file, se necessario)come posso fare?

Ho scritto così
(senza fare operazioni di fseek, fsetpos ... (ecc.) prima di questa)
Codice:

ok = TRUE;
...
while(ftell(fc)!=SEEK_END && ok == TRUE)
{
fgets(s,100,fc);
if(strcmp(s,"")==0)
ok = FALSE;
}


OVVIAMENTE dà seg fault.



------
split da qui - n.d.chemicalbit
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11810
Residenza: Tokelau

MessaggioInviato: 26 Set 2008 11:56    Oggetto: Re: Righe vuote? Rispondi citando

mmm... ma la riga vuota non ha comunque un 'a capo' al fondo? ( carattere '\n' ) ...
Top
Profilo Invia messaggio privato HomePage
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


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

MessaggioInviato: 26 Set 2008 19:53    Oggetto: Rispondi citando

ho sostituito nella strcmp la "" con "\n" e "\0"... niente ancora, dà seg fault.
Non so veramente come fare...
Codice:

...
ok = true;
....
while( ftell(fc)!= SEEK_END && ok == TRUE )
{
ok = TRUE;   
fgets(s, 100, fc);
if(strcmp(s,"/n")==0)
ok=FALSE;
}


Mi sono spiegata su cosa devo fare?
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:31    Oggetto: Rispondi citando

Intanto che penso Think a quale possa essere ilmotivo del .... "ovviamente" Mad

faccio una domanda, sperando di non complicarti troppo la vita:
ma anche una riga formata ad es. solo da caratteri spazio (o casi simili), la devi considerare come se fosse una riga vuota?
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:11    Oggetto: Rispondi citando

si, diciamo che se una riga non comincia con una cifra{0...9} non è buona per me e devo passare alla successiva, SEMPRE CHE non siamo alla fine del file...

Ho visto con ddd che (mentre se siamo alla fine del file SEEK_END vale 2)
f_seek(fc) vale 96 se siamo all'ultima riga da analizzare... sulla quale cicla(ripete la fgets, sembra) finchè non viene lanciato SIGINT (interrupt) (una volta ha lanciato SIGTRAP, trace-breakpoint trap, con strcmp(s,"\0"))
Top
Profilo Invia messaggio privato
chemicalbit
Dio maturo
Dio maturo


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

MessaggioInviato: 27 Set 2008 09:51    Oggetto: Rispondi citando

Beh, allora dovremo "complicare" il programma per scartare anche le righe non buone.

(a meno che non ti convenga fare ilcontrario, prenderle tutte e poi man mano in base a cosa c'è dentro usarle -in modo magari diverso inbase al loro contenuto- o scartarle).


Quanto al "OVVIAMENTE dà seg fault. " dovremmo capire il perché.
Un seg fault (segmentation fault) succede quando un programma tenta di accedere (in lettura o scrittura) ad una parte delle amemoria che non gli è concesso, 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: 27 Set 2008 10:38    Oggetto: Rispondi citando

si, SIGSEV (segmentation fault) viene lanciato ad esempio, se cerco di accedere all'indice n+1 di un vettore con n elementi. Insomma a memoria non riservata (allocata) per le mie str.dati.
Spesso si tratta di condizioni scritte male di for e while.

io vorrei:

leggere una riga:
-se è vuota e non siamo alla fine del file => leggere la successiva fino a che ne trovo una valida o raggiungo la fine del file

-se siamo alla fine del file => uscire dalla lettura righe

-se non è del formato giusto dare la possibilità all'utente di modificarla (non nel file, semplicemente riassegnarla per il programma) (non strettamente necessario, se tutto funziona questo è il minimo, credo)

ho provato a usare fgetpos(...), fseek() ma credo di averle usate male...

Ps. stiamo parlando della stessa cosa qui e nella nuova discussione aperta!
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:51    Oggetto: Rispondi citando

saetta ha scritto:
Ps. stiamo parlando della stessa cosa qui e nella nuova discussione aperta!
Think
Qui stiamo parlando di saltare delle righe,
lì di ordinarle (o di popolare una lista di struct).
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11810
Residenza: Tokelau

MessaggioInviato: 29 Set 2008 17:33    Oggetto: Rispondi citando

saetta ha scritto:
Codice:
if(strcmp(s,"/n")==0)


a me la barra sembra al rovescio... Rolling Eyes
Top
Profilo Invia messaggio privato HomePage
chemicalbit
Dio maturo
Dio maturo


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

MessaggioInviato: 29 Set 2008 18:28    Oggetto: Rispondi citando

SverX ha scritto:
saetta ha scritto:
Codice:
if(strcmp(s,"/n")==0)


a me la barra sembra al rovescio... Rolling Eyes
Presumo sia una svista,
più sopra nello stesso messaggio l'ha scritta giusta.
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


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

MessaggioInviato: 30 Set 2008 01:04    Oggetto: Rispondi citando

Io farei così:
1) leggo una riga se non sono alla fine
2) creo una stringa a partire dalla riga letta eliminando tutti gli spazi
3) se la stringa ottenuta ha strlen(str)==0 allora la riga era vuota (o fatta di tanti spazi).
Il punto 3 è fattibile perchè fgets sostituisce '\n' con '\0' (se non ricordo male) e strlen non conteggia '\0'.
Per togliere gli spazi vedi un po' qui
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: 05 Ott 2008 22:36    Oggetto: Rispondi citando

Ragazzi...son sempre qui... Crying or Very sad

Ma prima di una chiamata f_tell(fp) devo settare in qulache modo (fsetpos())
la posizione corrente per il file fp? o è automatico che dopo l'apertura e nessun'altra operazione sia l'inizio del file???
Non ci levo le gambe...
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11810
Residenza: Tokelau

MessaggioInviato: 06 Ott 2008 12:53    Oggetto: Rispondi citando

...all'apertura (in lettura) di un file si è posizionati all'inizio. Si procede leggendo o -volendo- saltando...
Top
Profilo Invia messaggio privato HomePage
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


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

MessaggioInviato: 06 Ott 2008 19:02    Oggetto: Rispondi

Si... solo che lo facevo su un file di testo e fseek, ftell e... compagnia bella lavorano bene sui files binari(con SEEK_SET SEEK_END e SEEK_CUR)... sui file di testo devi metterti li e settare il cursore... sapendo già a che numero corrisponde la fine del file...Twisted Evil

In conclusione... ho lasciato perdere tali funzioni e ho messo le mie speranze nelle mani di fgets()... che se ritorna NULL vuol dire che sono alla fine del file (oppure errore) ma non certo riga vuota... se la riga del file è vuota la SANTA fgets() mette nella sua "line" un'\n' oltre a '\0' (che lo mette sempre)...

grazie a tutti x la collaborazione!!! Very Happy
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