Come conoscere il nuovo carattere di linea in fscanf?
Domanda
Come sapere che fscanf ha raggiunto una nuova riga \ n in un file. Ho usato le mie funzioni per farlo. So di poter usare i budget e quindi sscanf per il modello richiesto. Ma i miei requisiti non sono stabili, alcune volte voglio ottenere stringhe separate da TAB, altre volte stringhe separate da nuove linee e altre volte stringhe separate da caratteri speciali. Quindi, se c'è un modo per conoscere la nuova linea di fscanf, aiutatemi. Altrimenti sono ben accetti anche modi alternativi.
Grazie in anticipo.
Soluzione
fscanf(stream, "%42[^\n]", buffer);
è un equivalente di fgets (buffer, 42, stream). Non puoi sostituire il 42 con * per specificare la lunghezza del buffer nell'argomento (come puoi fare in printf), il suo significato è sopprimere l'assegnazione. Quindi
fscanf(stream, "%*[^\n]%*c");
leggi (e incluso) il carattere di fine riga successivo.
Qualsiasi identificatore di conversione diverso da [, c e n inizia saltando gli spazi bianchi.
Altri suggerimenti
Kernighan e Pike nell'eccellente libro ' The Practice of Programming 'mostra come usare sprintf ()
per creare un identificatore di formato appropriato includendo la lunghezza (simile agli esempi nella risposta di AProgrammer), e poi usalo nella chiamata a scanf ()
. In questo modo, puoi anche controllare i separatori. Le preoccupazioni circa l '"inefficienza" di questo approccio sono probabilmente errate: le alternative sono più difficili da ottenere.
Detto questo, di solito non uso la famiglia di funzioni scanf ()
per l'I / O dei file; Ottengo i dati in una stringa con una sorta di routine 'get line', quindi uso la famiglia di funzioni sscanf ()
per dividerli - o altri codici di analisi più specializzati.