Jump to content

fread e ficheiros de texto em C


killezio
 Share

Recommended Posts

Estou com uma dúvida, imaginem que temos um ficheiro de texto cujas primeiras linhas são algo do género:

102
2
10
 

E agora eu quero ler o primeiro número de uma só vez e gravá-lo numa variável. então faria algo do género:

fread( *variavel_tipo_inteiro_pequeno , sizeof( short int) , 1,*ficheiro);
 

Como é que o C vai buscar o 102? porque é que ele não pega por exemplo apenas no 12 pois, num ficheiro de texto, são caracteres cujo no total ocupam 2 bytes.

Outra questão é se temos que ter em conta a leitura do \n no final de cada linha.

Link to comment
Share on other sites

HappyHippyHippo

E agora eu quero ler o primeiro número de uma só vez e gravá-lo numa variável. então faria algo do género:

fread( *variavel_tipo_inteiro_pequeno , sizeof( short int) , 1,*ficheiro);

não

fread é para ler dados em binário, e não no formato textual (para não falar que o próprio exemplo está mal)

o que tens de fazer é :

int variavel;
if (fscanf(ficheiro, " %d", &variavel) != 1) {
 // erro na leitura
}

Outra questão é se temos que ter em conta a leitura do \n no final de cada linha.

isso é algo que depende sempre da leitura.

por exemplo, o código que coloquei acima, ao colocar o espaço inicial, já descarta esse mesmo caracter '\n'.

no entanto, como não é caso geral, o processo de leitura/descarte desse caracter tem de ser avaliado caso a caso.

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

então, mas eu já utilizei o fread para ler ficheiros de texto. em particular li em texto e o sítio onde coloquei foi diretamente num ficheiro binário

EDIT: já sei como fiz, no entanto se fread é para ficheiros binários porque é que ele funciona a ler a partir de ficheiros de texto para binários.

seria mais fácil se calhar se alguém explicasse como o fread funciona. e eu não quero dizer o que ele faz, pois isso percebe-se pelos argumentos da função.

Edited by killezio
Link to comment
Share on other sites

só tive um semestre em programação de microprocessadores, no entanto falámos disso. de qualquer forma agradecia imenso se me pudesses explicar. mesmo que eu nao perceba diretamente as coisas posso simplesmente pesquisar depois

Link to comment
Share on other sites

Acho que é melhor reformular a pergunta para: qual a forma mais simples de ler um número num ficheiro de texto? tanto quanto sei apenas só a ler caracter de cada vez e depois usar o número de algarismos para multiplicar por 10,100,1000 dependendo do número. ou seja, o número "123", ler 1 depois 2 e depois 3, e de seguida multiplicar o 2 por 10 e o 3 por 100 e adicionar tudo para obter 123.

Link to comment
Share on other sites

killezio,

A solução mais simples e mais utilizada é utilizar a função fscanf (ou scanf, se estiveres a ler do stdin).

Aqui fica um breve exemplo:

#include <stdio.h>

int main(void) {
 int n;

 scanf("%d", &n);
 printf("O número lido foi %d\n", n);

 return 0;
}
Edited by pwseo
Acrescentado exemplo.
Link to comment
Share on other sites

pois mas nesse caso a função scanf vai buscar os tais 2 ou 4 bytes ( que é o espaço que ocupa um inteiro) ao ficheiro de texto. ou seja se temos um ficheiro da seguinte forma:

10
2

o scanf deve ir buscar "10\n2" e guardar num inteiro nao? (para o caso do inteiro representar 4 bytes)

Edited by pwseo
tags code.
Link to comment
Share on other sites

Repara, se o ficheiro de texto é:

10
2

Então a função scanf irá ler apenas o número 10 para armazenar numa variável do tipo int.

Não é completamente claro o que estás a tentar fazer, e parece-me que estás a confundir bastante a leitura de um número inteiro vs leitura da representação textual de um número inteiro. Normalmente, quando falamos em ler um número, estamos a falar da sua representação textual (e utilizamos scanf, que lê 1 byte por cada algarismo), caso contrário estamos a falar de um valor que será lido com recurso a fread (que lê 2, 4, 8 ou N bytes, dependendo da amplitude do tipo de dados que indiques).

Link to comment
Share on other sites

eu estou a tentar ler a representação visual de um número inteiro já que estamos a falar de ler um ficheiro de texto. como é que a função scanf sabe que no seguinte exemplo de um ficheiro de texto:

"10qtr\n"

ao fazer fscanf para um inteiro ela lê corretamente o 10?

Link to comment
Share on other sites

A resposta a essa pergunta é relevante para a tua tarefa? Penso que não, e podes estar a complicar as coisas.

Querias saber como ler um número de um ficheiro de texto e foi-te explicado como isso é feito.

A forma como a scanf faz isso (ou seja, a sua implementação) não é para aqui chamada, a menos que queiras fazer isso de raiz tu mesmo. De qualquer modo envolve algo como ler cada dígito do número e multiplicar o seu valor pela potência de base 10 apropriada para no final somar todas as parcelas. Logicamente, ao ler 'q' a função sabe também que não está mais a ler o número.

Link to comment
Share on other sites

De qualquer modo envolve algo como ler cada dígito do número e multiplicar o seu valor pela potência de base 10 apropriada para no final somar todas as parcelas. Logicamente, ao ler 'q' a função sabe também que não está mais a ler o número.

era o que eu estava a fazer. bem obrigado pelo esclarecimento. inicialmente estava à procura de como ler um número de uma forma mais direta mas depois interessei-me por saber como o C funcionava

Link to comment
Share on other sites

era o que eu estava a fazer.

Sim, eu tinha visto no post que deixaste acima. No entanto, ninguém lê números manualmente excepto em situações muito particulares. Habitualmente utiliza-se scanf ou fscanf.

  • Vote 1
Link to comment
Share on other sites

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
 Share

×
×
  • 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.