Domanda

Sto usando fscanf per leggere un file che ha righe come
Numero & Lt; -whitespace - & Gt; stringa < -whitespace - > optional_3rd_column

Desidero estrarre il numero e la stringa da ogni colonna, ma ignoro la terza colonna se esiste

Dati di esempio:
12 pippo qualcosa
03 bar
24 qualcosa #compressione casuale

Vorrei estrarre 12, pippo; 03, bar; 24, qualcosa ignorando & Quot; qualcosa & Quot; e " #randomcomment "

Al momento ho qualcosa come

while(scanf("%d %s %*s",&num,&word)>=2)
{ 
assign stuff 
}

Tuttavia, ciò non funziona con le linee senza la terza colonna. Come posso fare in modo che ignori tutto dopo la seconda stringa?

È stato utile?

Soluzione

Mi sembra che la soluzione più semplice sia scanf ("% d% s " ;, & amp; num, & amp; word) e quindi fgets () per mangiare il resto della fila.

Altri suggerimenti

Il problema è che %*s sta mangiando il numero sulla riga successiva quando non c'è la terza colonna, e quindi il prossimo %d non riesce perché il token successivo non è un numero. Per risolverlo senza usare gets() seguito da sscanf(), puoi usare la classe di caratteri specificata:

while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{ 
    assign stuff 
}

Il [^\n] dice di abbinare il maggior numero possibile di caratteri che non sono newline e il * sopprime il compito di prima. Si noti inoltre che non è possibile inserire uno spazio tra %s e %*[\n], poiché altrimenti lo spazio nella stringa di formato corrisponderebbe alla nuova riga, facendo sì che <=> corrisponda all'intera riga successiva, che non è ciò che vuoi.

Usa fgets () per leggere una riga alla volta e poi usa sscanf () per cercare le due colonne che ti interessano, più robuste e non devi fare nulla di speciale per ignorare i dati finali.

Uso spesso gets () seguito da uno sscanf () sulla stringa che hai appena, ehm,

Bonus: puoi separare il test per la fine dell'input dall'analisi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top