Fazendo fscanf Ignorar parâmetro opcional
Pergunta
Eu estou usando fscanf para ler um arquivo que tem linhas como
Número <-whitespace-> string <-whitespace-> optional_3rd_column
Gostaria de extrair o número e string de fora de cada coluna, mas ignorar o 3rd_column se existir
Exemplo de dados:
12 foo algo
03 bar
24 algo #randomcomment
Eu gostaria de extrair 12, foo; 03, bar; 24, algo ignorando "algo" e "#randomcomment"
Actualmente tenho algo como
while(scanf("%d %s %*s",&num,&word)>=2)
{
assign stuff
}
No entanto, isto não funciona com linhas sem 3ª coluna. Como posso fazê-lo ignorar tudo após a 2a corda?
Solução
Parece-me que a solução mais simples é scanf ( "% d% s", e num, e Word) e, em seguida, fgets () para comer o resto da linha.
Outras dicas
O problema é que o %*s
está comendo o número na próxima linha quando não há terceira coluna, e depois o próximo %d
está falhando porque o próximo token não é um número. Para corrigi-lo sem usar gets()
seguido por sscanf()
, você pode usar a classe de caracteres especificado:
while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{
assign stuff
}
O [^\n]
diz para coincidir com o maior número de caracteres possível que não são novas linhas, ea suprime *
atribuição como antes. Observe também que você não pode colocar um espaço entre o %s
eo %*[\n]
, porque senão que o espaço na string de formato iria coincidir com a nova linha, fazendo com que o %*[\n]
para corresponder toda a linha seguinte, o que não é o que você quer.
Utilize fgets () para ler uma linha de cada vez e, em seguida, use sscanf () para procurar as duas colunas que você está interessado, mais robustos e você não tem que fazer nada especial para ignorar fuga de dados.
Muitas vezes eu uso gets () seguido de uma sscanf () no texto que apenas, er, gots.
Bonus:. Você pode separar o teste para o fim-de-entrada a partir da análise