|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Sep 2005
Messaggi: 27
|
[c] Sapere numero di righe di un file di testo
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. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 979
|
Prova a leggerlo con la funzione fgets. Quando il carattere è uguale a '\n' allora incrementi un contatore di 1. Non è difficile
__________________
Workstation: CPU AMD Ryzen 5900X @ 4900 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Sep 2005
Messaggi: 27
|
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
Ultima modifica di Biscazziere : 17-07-2006 alle 11:53. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
non l'hanno ancora eliminata ? Ti posso solo consigliare di contare i \n ad ogni fscaneffata ...
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#5 | ||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() Quote:
leggi con fread a blocchi di 4 kb e analizza i blocchi byte per byte; ad ogni \n che trovi incrementi il contatore. |
||
|
|
|
|
|
#6 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#7 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
LOL, ma questo Linux fa acqua da tutte le parti
|
|
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
ma vabbè, porello... è vecchio di decenni ormai...
|
|
|
|
|
|
|
#9 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
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
![]() mi piacerebbe tanto conoscere la risposta... praticamente quelle funzioni sono inutilizzabili |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
ciao |
|
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Sep 2005
Messaggi: 27
|
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?" |
|
|
|
|
|
#12 | |||
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Quote:
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|||
|
|
|
|
|
#13 |
|
Junior Member
Iscritto dal: Sep 2005
Messaggi: 27
|
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 |
|
|
|
|
|
#14 | ||
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
||
|
|
|
|
|
#15 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
infatti, rassegnati e goditi la possibilità di dire al tuo prof che è niubbo...
![]() Quote:
|
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
ASPETTA!
prima di niubbare il tuo prof! si puó fare: Codice:
fscanf(pf, "%c", s ); Devi poi analizzare s[0] Ora vo via spero tu abbia capito EDIT: ieri con la fretta non ci ho pensato ... Codice:
char c; ... fscanf(pf, "%c", &c );
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve Ultima modifica di trallallero : 18-07-2006 alle 07:55. |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#19 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() perché come si fa in una sola linea con le espressioni regolari...?
|
|
|
|
|
|
|
#20 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Potresti provare con qualcosa di questo tipo:
Codice:
#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;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:03.






















