problemas com scanset

1. problemas com scanset

ian cléver sales fernandes
ianclever

(usa Arch Linux)

Enviado em 30/11/2013 - 11:31h

gente o que eu estou perguntando aqui na verdade não é bem um erro eu só quero saber se é possível ter 2 scanset dentro de 1 único scanf ou fscanf?


a duvida surgiu depois disso, estou ca eu fazendo um código e lá pelas tantas surgiu a necessidade de agilizar(para eu programador) a escrita formatada em um arquivo texto e a leitura também então optei por escrever tudo que precisava com fprintf e ler com fscanf, a escrita foi ok, foi algo asssim( em um arquivo texto aberto para escrita e posteriormente fechado):

 fprintf(stream,"%d\n%s\n%c\n%c\n",inteiro,string,char1,char2); 



isso produz uma saida assim(vou ilustrar os \n para ficar mais fácil de entender)


10\n
string\n
c\n
$\n


aí depois dissso( como já disse) fechei o arquivo e reabri agora para leitura e fiz o que seria o certo:

fscanf(stream,"%d %*c %s[^\n] %*c %c %*c %c %*c",&inteiro,string,&char1,&char2); 


seria para ele ler primeiramente o inteiro e deixar o \n para o proximo modificador, mas por algum motivo ele já lê direto e enfia ele em algum lugar, então tive que mudar:

fscanf(stream,"%d %s[^\n] %*c %c %*c %c %*c",&inteiro,string,&char1,&char2);  


aí ele leu o inteiro e a string e ignorou o \n pq eu mandei ele ignorar então lógicamente eu teria que ler ele no próximo modificador, mas não lia então eu tentei o mesmo do segundo mas sem sucesso:

fscanf(stream,"%d %s[^\n] %c %*c %c %*c",&inteiro,string,&char1,&char2);  


daí eu deduzi que o scanset do anterior estava me impedindo de ler o \n , eu até coloquei outro scanset naquele char para poder forçar ele a ler o \n que ficou, mas nada, então para resolver eu fiz o seguinte:

fscanf(stream,"%d %s[^\n]",&inteiro,string);
fscanf(stream,"%*c %c %*c %c %*c",&char1,&char2);


daí eu identifiquei que o modificador de char no fscanf também lê o caractere e já enfia o \n em algum lugar, então só restou um \n voando no espaço, sendo assim eu poderia resumir em uma única linha, mas para isso tenho que usar 2 scansets, a leitura atual está assim(funcionando mas ainda da para melhorar):
fscanf(stream,"%d %s[^\n]",&inteiro,string);
fscanf(stream,"%*c %c %c",&char1,&char2);


Reforço mais uma vez a pergunta, dá para usar 2 ou mais scansets em uma única função scanf ou fscanf?




  


2. Re: problemas com scanset

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/12/2013 - 02:31h

A função scanf() está entre as que eu considero mais complicadas na biblioteca padrão do C. Eu recomendo que você leia a documentação dela com atenção (a manpage de scanf do Linux é muito boa, por sinal), procurando saber quais conversões pulam espaços em branco (entre as quais estão "%d" e "%s") e quais não pulam (a exemplo de "%c" e "%[").

Vale lembrar que "espaço em branco", para scanf(), não é só este que nós usamos entre uma palavra e outra; tabulações, quebras de linha e quebras de página também são considerados espaços em branco pelos itens de formatação que fazem a função de "pular espaços".

Entre os itens que fazem pular espaços quando expressos na string de formatação está o próprio caráter de espaço. Se você quiser localizar especificamente o '\n' numa determinada posição, deve ter o cuidado de capturá-lo com uma conversão que não pule espaços por conta própria, e não pode preceder essa conversão na string de formatação com espaços.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts