View Full Version : [c] Sapere numero di righe di un file di testo
Biscazziere
17-07-2006, 00:41
Ciao, leggo le parole che compongono un file di testo con la funzione fscanf, che salta i caratteri tipo a capo e spazio. Come posso fare per sapere a che riga del file mi trovo mentre sto leggendo una parola con fscanf?
Grazie.
Prova a leggerlo con la funzione fgets. Quando il carattere è uguale a '\n' allora incrementi un contatore di 1. Non è difficile
Biscazziere
17-07-2006, 10:41
il problema è che sono vincolato ad usare fscanf... ho letto che ad esempio scrivendo fscanf(fp, "%[^\n]s", parola) posso evitare/includere dei caratteri tipo lo \n. Non c'è modo di fare leggere a fscanf anche gli a capo invece di saltarli? Oppure di usare una compinazione di fscanf e quanlche altra funzione
trallallero
17-07-2006, 13:43
il problema è che sono vincolato ad usare fscanf... ho letto che ad esempio scrivendo fscanf(fp, "%[^\n]s", parola) posso evitare/includere dei caratteri tipo lo \n. Non c'è modo di fare leggere a fscanf anche gli a capo invece di saltarli? Oppure di usare una compinazione di fscanf e quanlche altra funzione
la fscanf ? :muro:
non l'hanno ancora eliminata ? :D
Ti posso solo consigliare di contare i \n ad ogni fscaneffata ...
il problema è che sono vincolato ad usare fscanf... allora l'esercizio non si può fare perché non sai quanto spazio allocare per il buffer :Prrr:
Non c'è modo di fare leggere a fscanf anche gli a capo invece di saltarli? Oppure di usare una compinazione di fscanf e quanlche altra funzione fai una fscanf a vuoto e usa fread :D
leggi con fread a blocchi di 4 kb e analizza i blocchi byte per byte; ad ogni \n che trovi incrementi il contatore.
allora l'esercizio non si può fare perché non sai quanto spazio allocare per il buffer :Prrr: mi correggo: puoi allocare uno spazio equivalente alla dimensione del file :asd:
mi correggo: puoi allocare uno spazio equivalente alla dimensione del file :asd: mi correggo nuovamente: non puoi perché dopo che hai allocato il buffer un altro processo potrebbe ingrandire il file scrivendoci un'unica linea lunga il doppio delle dimensioni precedenti :D
LOL, ma questo Linux fa acqua da tutte le parti :rotfl:
LOL, ma questo Linux fa acqua da tutte le parti :rotfl: ma neanche Linux, diciamo proprio Unix :D
ma vabbè, porello... è vecchio di decenni ormai... :asd: :friend:
bah, io mi sto ancora sinceramente chiedendo chi ha scritto i prototipi delle funzioni Unix come c***o pensava che avrebbero dovuto fare i programmatori a sapere le dimensioni dei buffer :mbe:
mi piacerebbe tanto conoscere la risposta... praticamente quelle funzioni sono inutilizzabili
ma neanche Linux, diciamo proprio Unix :D
ma vabbè, porello... è vecchio di decenni ormai... :asd: :friend:
Che centrano unix e linux? Con C avresti gli stessi problemi su qualsiasi sistema operativo.
ciao ;)
Biscazziere
17-07-2006, 15:02
Dunque, io leggo le varie parole del file di testo così:
fscanf(fp, "%s", parola);
per quanto ne so la fscanf elimina automaticamente gli spazi e gli a capo, quindi non vengono letti gli spazi e gli a capo e non ho modo di verificare quando è stato letto un a capo. Non c'è modo con la fscanf di far leggere gli a capo e di metterli al fondo della stringa "parola", in modo poi da poter verificare?
Cosa significa "fare una fscanf a vuoto e poi usare fread?"
trallallero
17-07-2006, 15:16
per quanto ne so la fscanf elimina automaticamente gli spazi e gli a capo, quindi non vengono letti gli spazi e gli a capo e non ho modo di verificare quando è stato letto un a capo.
'azz é vero! il mio suggerimento va a farsi fottere :D
Non c'è modo con la fscanf di far leggere gli a capo e di metterli al fondo della stringa "parola", in modo poi da poter verificare?
che io sappia no ...
Cosa significa "fare una fscanf a vuoto e poi usare fread?"
suppongo fare un fscanf per rispettare le regole dell'esercizio e poi fai come pare a te :D
Biscazziere
17-07-2006, 15:24
su un sito ho trovato una sintassi del genere, c'è scritto che serve per modificare quello che viene letto dalla fscanf:
fscanf(fp, "%[^\n]s", parola);
Non ho trovato molte spiegazioni, qualcuno ne sa qualcosa?
Posso usare insieme alla fscanf qualche altra funzione tipo fgetc? Avevo provato solo che usando anche fgetc mi si sballava il punto a cui era arrivato il file pointer per la fscanf
trallallero
17-07-2006, 15:39
su un sito ho trovato una sintassi del genere, c'è scritto che serve per modificare quello che viene letto dalla fscanf:
fscanf(fp, "%[^\n]s", parola);
Non ho trovato molte spiegazioni, qualcuno ne sa qualcosa?
Posso usare insieme alla fscanf qualche altra funzione tipo fgetc? Avevo provato solo che usando anche fgetc mi si sballava il punto a cui era arrivato il file pointer per la fscanf
dal man di fscan
... reading input until no more valid input can
be read, or up to the first byte which is not a white-space
character which remains unread.
Secondo me non c'é soluzione con la fscanf.
infatti, rassegnati e goditi la possibilità di dire al tuo prof che è niubbo... :asd:
suppongo fare un fscanf per rispettare le regole dell'esercizio e poi fai come pare a te :D esatto :rotfl:
trallallero
17-07-2006, 15:58
infatti, rassegnati e goditi la possibilità di dire al tuo prof che è niubbo... :asd:
beato lui, che goduria :D
trallallero
17-07-2006, 16:03
ASPETTA!
prima di niubbare il tuo prof! :D
si puó fare:
fscanf(pf, "%c", s );
dove s é comunque una stringa (s[2])
Devi poi analizzare s[0]
Ora vo via spero tu abbia capito
:)
EDIT: ieri con la fretta non ci ho pensato ... :D
char c;
...
fscanf(pf, "%c", &c );
non serve s[] come stringa ma basta un char singolo e passi alla fscanf l'indirizzo ;)
sottovento
17-07-2006, 16:06
su un sito ho trovato una sintassi del genere, c'è scritto che serve per modificare quello che viene letto dalla fscanf:
fscanf(fp, "%[^\n]s", parola);
Non ho trovato molte spiegazioni, qualcuno ne sa qualcosa?
Ciao,
la fscanf() in oggetto e' stata scritta pensando che accetti in ingresso delle espressioni regolari. Non mi risulta che sia possibile, magari si trattava di una libreria non standard, oppure e' una delle tante cose che non conosco.
Certo che avendo a disposizione le espressioni regolari, il tuo programma si ridurrebbe ad una sola linea.
High Flying
Sottovento
Ciao,
la fscanf() in oggetto e' stata scritta pensando che accetti in ingresso delle espressioni regolari. Non mi risulta che sia possibile, magari si trattava di una libreria non standard, oppure e' una delle tante cose che non conosco. si che è possibile... :huh:
perché come si fa in una sola linea con le espressioni regolari...? :mbe:
Potresti provare con qualcosa di questo tipo:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char c;
int riga = 0;
FILE *in;
if (argc != 2)
return 0;
in = fopen(argv[1], "r");
if (in == NULL) {
perror("fopen()");
exit(EXIT_FAILURE);
}
for (;;) {
char buffer[256] = {0};
int result = fscanf(in, "%255[^ \f\n\r\t\v]%c", buffer, &c);
if (result == EOF)
break;
if (result == 2) {
printf("riga: %d parola: %s\n", riga+1, buffer);
if (c == '\n')
++riga;
} else if (result == 0) {
if (fscanf(in, "%c", &c) == 1 && c == '\n') {
printf("riga %d vuota\n", riga+1);
++riga;
}
} else {
puts("Percepisco una turbolenza nella forza...");
break;
}
}
fclose(in);
return 0;
}
trallallero
18-07-2006, 06:58
puts("Percepisco una turbolenza nella forza...");
:eek:
:D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.