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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top