Jump to content

ler dois numeros num ficheiro de texto


Recommended Posts

Posted

A minha dúvida é a seguinte , digamos que eu tenha um ficheiro chamado

teste.txt

dentro deste ficheiro tenho duas linhas de texto

linha 1 -> 25 30

linha 2 ->blablabla nao interessa

//fazendo isto
FILE *ficheiro;
char *stringp1,*stringp2,string1 [3],string2 [3];
ficheiro=fopen("teste.txt","r");
string1 =fgets(string1,3,ficheiro);
string2 =//?


O que eu quero é ler no máximo 2 caracteres e passa-los para a string 1 , depois tenho sempre um espaço e começo a ler outros dois caracteres e passo para a string 2

ou seja string1 ->25

string2 ->30

Posted

Se tens a certeza do formato existente no ficheiro

string1[0] = fgetc(ficheiro); // '2'
string1[1] = fgetc(fcheiro); // '5'
string1[2] = 0; // "terminar" a string
fgetc(ficheiro); // ignora espaco
string2[0] = fgetc(ficheiro); // '3'
string2[1] = fgetc(ficheiro); // '0'
string2[2] = 0; // "terminar" a string
// o proximo fgetc() devolve um '\n'

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

e se não tiver a certeza ?

Sem certezas deves contruir um "parser".

Usa fgets() para ler a linha inteira, depois strtol() para isolar os numeros tendo em atenção se houve erros ou não.

Também podes usar scanf(), mas esta função tem esquisitices que são chatas de programar, principalmente quando há caracteres inesperados no input.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

o imput são sempre dois números

podem é estar com 1 ou 2 dígitos

nessa linha nunca vai haver mais nada.

Ou seja uso o fgets e leio a linha toda e depois como uso o scanf para separar estes dois números e guarda-los como int ?

Posted

Se quiseres obter a sequencia de digitos (uma string) usa a sugestão do HappyHippo.

Se preferes converter as string em numeros inteiros, usa a sugestão do HappyHippo trocando as string por inteiros:

char buf[100];
int num1, num2;
/* ... */
if (fgets(buf, sizeof buf, ficheiro) == NULL) /* erro */;
if (sscanf(buf, "%d%d", &num1, &num2) != 2) /* erro */;

Nota: é sscanf() com 2 s (vem de String Scan Formatted).

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Ok o que eu ja tenho é isso

FILE *f;
char filename [20],*strp,strfinal [6];
int lin,col;
gets (filename);
f=fopen(filename,"r");
strp=fgets(strfinal,6,f);
sscanf ("%d %d",&lin,&col);

era isto ?

Posted

porque perguntas ????

já compilaste e correste ???

tens um erro e uma instrução desaconselhada :

instrução a trocar :

//gets (filename);                               gets é para esquecer !!!
fgets(filename, 6, stdin);

erro:

//sscanf ("%d %d",&lin,&col);           o primeiro parametro do sscanf e a string de onde vai ser lido os elementos 
sscanf (strp, "%d %d",&lin,&col);
IRC : sim, é algo que ainda existe >> #p@p
Posted

não tenho mau , escrevi foi mal aqui :S

mas sim já compilei e parecia estar tudo certo.

quanto ao gets(filename)

para receber o input do nome do ficheiro

o que ta mal ?

--

outra coisa , usar o apontador e a string como primeiro argumento do sscanf vai dar o mesmo , pk?

Posted

quanto ao gets(filename)

A funcao gets() é impossivel de usar com seguranca. A funcao fgets() faz mais ou menos a mesma coisa e é bastante segura quando usada correctamente. Usa fgets() em vez de gets() e, se necessario, remove o enter final que fgets() mantem no input (ao contrario de gets()).

Outro ponto importante acerca do gets(): a versao actualizada da linguagem C (publicada em Dezembro de 2011) nao descreve o que essa funcao faz. Se algum compilador diz ser compilador de C11 e aceitar gets() sem se queixar, isso é porque esta a usar uma extensao. As versoes anteriores da linguagem tinham a descricao de gets() ... por isso é capaz de levar algum tempo até a funcao deixar de existir. Mas nao uses gets().

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.