2013-03-08 12 views
5

Sto cercando di leggere un file formattato in questo modo generale:C - fscanf numeri misti e testo statico

Text Description: 12 
Description2: 1 
More descriptive things: 6 

E vorrei leggere i numeri 12, 1, e 6 in variabili.

Ho provato il codice come questo:

fscanf(fptr, "Text Description:%d",&desc1); 
fscanf(fptr, "Description2:%d",&desc2); 
fscanf(fptr, "More descriptive things:%d",&desc3); 

Ma per qualche motivo è popolato solo la prima variabile. Qualcuno sa perché questo è il caso?

risposta

1

Add spazio all'inizio del formato di stringa per evitare il nuovi problemi di linea

fscanf(fptr, " Text Description:%d",&desc1); 
fscanf(fptr, " Description2:%d",&desc2); 
fscanf(fptr, " More descriptive things:%d",&desc3); 
+2

'% d' consuma già tutto lo spazio bianco precedente. Gli unici '%' s che non consumano spazi bianchi sono '% c' e'% ['. – Shahbaz

+0

in tal caso deve solo aggiungere spazio all'inizio del formato stringa. Grazie per la risposta di commento aggiornata – MOHAMED

0

Non si sta leggendo la nuova riga dopo aver elaborato il 12, quindi le altre due chiamate lo trovano invece della stringa o del numero intero e quindi non riuscite. È possibile utilizzare uno spazio nella prossima chiamata fscanf (che consuma tutti i caratteri di spazi bianchi che precedono la stringa che si desidera abbinare). In alternativa puoi consumarlo con una chiamata allo fgetc, a condizione che ciascuna linea termini immediatamente con un avanzamento di riga, ad es.

fscanf(fptr, "Text Description:%d",&desc1); 
fgetc(fptr); // drop the next character 
fscanf(fptr, "Description2:%d",&desc2); 

Dropping tutto l'input flusso dopo il numero intero e fino al prossimo '\ n' può essere fatto con un ciclo invece:

while (fgetc(fptr) != '\n') 
    ; 
+0

mi piacerebbe aggiungere un '&& feof (fptr)' per il ciclo while nel caso in cui (forse verificare la presenza di 'ferror' anche se sei troppo paranoico;) – Shahbaz

+0

@Shahbaz: sì , ma suppongo che questo file di input sia come dato. Avrebbe bisogno di molti controlli per i file di input non affidabili. – teppic

+0

Migliore controllo rispetto a 'EOF'. Chiamare 'feof' senza 'EOF' trovato sarebbe errato. – md5