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

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 26 Set 2008 10:58 Oggetto: Saltare righe vuote da un file di testo che si sta leggendo |
|
|
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 |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11810 Residenza: Tokelau
|
Inviato: 26 Set 2008 11:56 Oggetto: Re: Righe vuote? |
|
|
mmm... ma la riga vuota non ha comunque un 'a capo' al fondo? ( carattere '\n' ) ... |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 26 Set 2008 19:53 Oggetto: |
|
|
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 |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 26 Set 2008 21:31 Oggetto: |
|
|
Intanto che penso a quale possa essere ilmotivo del .... "ovviamente"
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 |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 27 Set 2008 08:11 Oggetto: |
|
|
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 |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 27 Set 2008 09:51 Oggetto: |
|
|
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 |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 27 Set 2008 10:38 Oggetto: |
|
|
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 |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 27 Set 2008 20:51 Oggetto: |
|
|
saetta ha scritto: | Ps. stiamo parlando della stessa cosa qui e nella nuova discussione aperta! |
Qui stiamo parlando di saltare delle righe,
lì di ordinarle (o di popolare una lista di struct). |
|
Top |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11810 Residenza: Tokelau
|
Inviato: 29 Set 2008 17:33 Oggetto: |
|
|
saetta ha scritto: | Codice: | if(strcmp(s,"/n")==0) |
|
a me la barra sembra al rovescio...  |
|
Top |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 29 Set 2008 18:28 Oggetto: |
|
|
SverX ha scritto: | saetta ha scritto: | Codice: | if(strcmp(s,"/n")==0) |
|
a me la barra sembra al rovescio...  | Presumo sia una svista,
più sopra nello stesso messaggio l'ha scritta giusta. |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 30 Set 2008 01:04 Oggetto: |
|
|
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 |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 05 Ott 2008 22:36 Oggetto: |
|
|
Ragazzi...son sempre qui...
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 |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11810 Residenza: Tokelau
|
Inviato: 06 Ott 2008 12:53 Oggetto: |
|
|
...all'apertura (in lettura) di un file si è posizionati all'inizio. Si procede leggendo o -volendo- saltando... |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 06 Ott 2008 19:02 Oggetto: |
|
|
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...
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!!!  |
|
Top |
|
 |
|