2012-11-04 18 views
12

Ho fscanf per leggere le righe di impostazione da un file di configurazione. Queste impostazioni sono strettamente predefiniti formato che assomigliafscanf e carattere di nuova riga

name1=option1; 
name2=option2; 
... 

in modo sostanzialmente lo faccio

fscanf(configuration,"%[^=]=%[^;];",name,option); 

cui configurazione è il flusso di file e il nome e l'opzione di programmazione sono i buffer.

Il problema è che il buffer dei nomi contiene un carattere di nuova riga che non desidero. C'è un identificatore di formato che ho perso in "[^ ...]" impostato per saltare il carattere di nuova riga? Ad ogni modo, può essere risolto attraverso il formato specificatore di sempre?

BTW: Ingoiare il carattere di nuova riga da scrivendo questo

"%[^=]=%[^;];\n" 

non è elegent credo che per il carattere di nuova linea potrebbe ripetere più di una volta da nessuna parte.

+1

Se i campi 'nomeN' non possono contenere spazi bianchi, basta aggiungere uno spazio davanti alla stringa di formato -' "% [^ =] =% [^;];" '- per saltare gli spazi bianchi iniziali. Se possono, è necessario consumare la newline da sola con 'getchar()'. –

+1

La risposta accettata è giusta, comunque, riguardo alle nuove righe ripetute è possibile usare '% * [\ n]' per leggere un numero arbitrario di ''\ n'' senza memorizzarle. – effeffe

risposta

11

Basta aggiungere spazio alla fine della stringa di formato:

"%[^=]=%[^;]; " 

Questa mangerà tutti i caratteri di spazio bianco, comprese le nuove linee.

Citazione dal cplusplus.com:

carattere di spazio bianco: la funzione leggerà e ignorare eventuali caratteri di spazio bianco incontrati prima del prossimo carattere non-spazio bianco (spazi bianchi includere spazi, a capo e caratteri di tabulazione - vedi isspace). Un singolo spazio nella stringa di formato convalida qualsiasi quantità di caratteri di spaziatura estratti dallo stream (incluso nessuno).

+0

È grandioso. Grazie. – Yang

1

Ciò funzionerà:

fscanf(configuration,"%[^=]=%[^;];%[^\n]",name,option,dummy);

si dovrà consumare la nuova linea character.Otherwise, la nuova riga viene lasciato nel flusso di input.

+0

hmm ... quindi quanto dovrebbe essere grande? Abbastanza grande da inghiottire tutti i possibili caratteri di nuova riga? – Yang

+0

Poiché hai affermato di avere un formato predefinito prestabilito di dati di input, potresti calcolare il n. di caratteri esattamente necessari e creare la variabile dummy. Questo ti aiuterà a scoprire eventuali deviazioni dal formato di input, piuttosto a saltarle. (Che succederà se usi uno spazio, prima o dopo in fscanf o fgets). – askmish

+1

C'è un '%' mancante vicino alla fine, comunque perché non usare '% [^ =] =% [^;];% * [^ \ n]' e dimenticarsi di quelle newline e del buffer per contenerle? – effeffe

6

Un'alternativa è utilizzare fgets() per leggere l'intera riga in una stringa, quindi utilizzare sscanf(). Ciò ha un vantaggio nel debugging in quanto è possibile vedere esattamente quali dati sta funzionando la funzione.

Problemi correlati