Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pulse

Ler arquivo

Recommended Posts

#include <stdio.h>


int main ()

{

FILE *arqv;

int a;


arqv = fopen("teste", "r");

fscanf(arqv, "%i", &a);

printf("%i", a);

}



No arquivo que vai ser lido só tem um único número que é 9, mas quando vou printar a variável que supostamente iria receber o número 9 sempre printa o número 8. Já testei com outros números no arquivo mas sempre printa 8



Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Olá!

 

 

Pulse, quando eu compilei o código aqui o programa funcionou perfeitamente! Mas vou tentar lhe ajudar!

 

 

- tente iniciar a variável a com um valor ex: a = 0, não acredito que o problema seja lixo de memoria, mas vale a pena tentar e fazê-lo sempre!

 

- se as funções fprintf e fscanf, tem as mesmas características das printf e scanf, evite usar o código de formatação %i principalmente no scanf, pois em algumas situações pode ser que ele interprete um valor como sendo octal, causando algum tipo de erro no programa, use %d.

 

- com relação ao arquivo, quando eu estudava arquivos algumas semanas atrás, eu comecei a receber dados errados ao tentar ler as informações de um determinado arquivo, no final acho que o problema foi de que de tanto alterar o arquivo acabei o corrompendo.

 

Não acredito que seja o seu caso, mas de toda forma tente excluir o arquivo e criar um novo, como tive que fazer no meu caso!

 

- com relação ao código, muito provavelmente você não o fez para poupar tempo, mas introduza alguma estrutura de controle ex: ( if ), durante a abertura do arquivo, para mostrar uma mensagem caso ocorra alguma falha ao abrir o arquivo.

 

- e é importante também o fclose() no final, atualmente é mais difícil nos sistemas atuais, mas dependendo do sistema em que você está, sair sem fechar explicitamente o arquivo pode causar algum corrompimento no mesmo!

 

 

Bom, só posso ir ate aqui, boa sorte!

 

 

Ubuntu 14.04 LTS 32-bit Codeblocks 13.12 GNU gcc 4.4.8

 

 

Espero ter ajudado ! ! !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Felipe. Muito obrigado pelas dicas, só funcionou quando eu usei .txt depois do nome do arquivo.

Você poderia me recomendar um bom livro pra estudar C? Conheço alguns aqui mas não gosto muito deles.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Bom os Livros que estou estudando no momento e que acho bons em nível de prioridade caso você os queira, são:

 

 

1 - C how to Programm sixth edition

1 - Como programar Em C - Paul J. Deitel e Harvey M. Deitel

 

Os dois acima são o mesmo livro, mas o primeiro é em inglês e o segundo em português!

 

2 - C completo e total 3ª Edição - Português

 

3 - Linguagem C 10 ª Edição Luís Damas - Português

 

4 - C Programming for the Absolute Beginner, Second Edition - Inglês

 

5 - Beginning C From Novice to Professional, Fourth Edition - Inglês

 

além, de varias apostilas ! ! !

 

 

Se você tiver interesse pode assistir video aulas no YouTube, que me foram bastante uteis:

 

https://www.youtube.com/user/progdescomplicada/videos

 

https://www.youtube.com/user/italogross/videos

 

https://www.youtube.com/user/gtechinfor/videos

 

https://www.youtube.com/channel/UC6OSl56Q5t22j8bqTx4ZVhQ/videos

 

https://www.youtube.com/user/Web4Programmers/videos

 

https://www.youtube.com/user/marcoscastro87/videos - C++

 

 

 

Acho que é só!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou normal aqui comigo, mesmo sem extensão do arquivo (estou no Linux).

 

 

 

- com relação ao código, muito provavelmente você não o fez para poupar tempo, mas introduza alguma estrutura de controle ex: ( if ), durante a abertura do arquivo, para mostrar uma mensagem caso ocorra alguma falha ao abrir o arquivo.

Dica p/ vcs não perderem tempo criando mensagens p/ todos os casos:
http://linux.die.net/man/3/fopen

Leiam as seções "Return value" e "Errors". Reparem que em caso de erro a função retorna NULL e define uma variável chamada errno. As definições podem ser encontradas em errno.h (http://linux.die.net/man/3/errno)

O código ficaria assim:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main () {
    FILE *arqv;
    int a;
 
    arqv = fopen("teste", "r");
    if (!arqv) {
    	printf("ERROR: %s\n", strerror(errno));
    	return 1;
    }
    fscanf(arqv, "%i", &a);
    printf("%i", a);
    fclose(arqv);
    return 0;
}

E a saída (mensagem de erro) informada ali no printf dependendo do caso:

1- Arquivo inexistente: ERROR: No such file or directory

2- Permissões insuficientes (não tenho permissão de leitura no arquivo): ERROR: Permission denied

Deixe o sistema indicar o que aconteceu ao realizar a operação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse é meu primeiro aporte assim que espero que não sejam duros comigo.=)

 

A função fprintf ela esta feita para imprimir tudo como si de strings se tratasse igual que a fscanf lê strings.

 

O formato do arquivo é o que menos importa. O que importa é a forma que vc abre o arquivo com fopen e que funçoes vc esta usando para guardar dados no arquivo.

 

Si no fopen indicamos "rb", então estamos lendo de um arquivo binário. Um arquivo binário funciona como a memoria RAM do nosso computador, onde um inteiro tem (no caso do meu computador) 4 Bytes, e fscanf vai ler isso corretamente já seja binário ou não.

 

O problema esta na função fprintf que guarda o dado como si fosse string, si guardamos um int com essa função, nosso int vai passar a ser um bonito string, si guardamos int n = 234; no arquivo com fprintf, vamos obter "234", o que equivale a 3Bytes, um por cada char. :yes: Vc pode ver isso no tamanho do arquivo. Isso não é um texto com formato, continua sendo texto plano, por más que nosso arquivo seja binário :yay: , pois usamos a função errada para gravar.

 

Para que podamos gravar um inteiro em um arquivo que o abrimos como "wb" ou "ab" (SEM IMPORTAR SI ES TXT DAT OU SEI LA),e esse conserve seu formato como inteiro(4Bytes) melhor é usar fwrite: fwrite( &inteiro, sizeof(int), 1, arquivo );. //inteiro é um int inteiro. =D

 

Agora vamos lá no arquivo e vemos que o arquivo tem 4Bytes, e que nesses 4Bytes podemos guardar tudo o que nos permita um inteiro que são 65 mil e pico repartidos entre negativos e positivos más o menos.

 

Então lembre: Não importa o formato do arquivo e sim como abrir ele(modo de abertura), si não por b no modo de abertura ele é texto plano, si por b no modo de abertura ele admite variáveis como si de uma RAM si tratasse. Aparte disso para guardar um int como int sem transformá-lo em string vc tem que usar funções adequadas, uma delas é fwrite. Para ler não importa qual usamos... fscanf, fread etc etc.

 

As funções fprintf e fscanf, são boas opções para texto plano, e fread com fwrite, para binários, melhor não misturar.

Então juntando todos os conselhos neste tema acho que já da para ter uma ideia.
Muita sorte. :bye:

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

O formato do arquivo é o que menos importa.
Desculpa aí, mas o formato do arquivo (distribuição dos dados) importa sim. O que não *deveria* importar é a *extensão*, mas cada sistema operacional identifica o arquivo de um jeito diferente.

 

O problema esta na função fprintf que guarda o dado como si fosse string
Não. Ela faz o print de acordo com o formato especificado porque há a "interpretação/conversão" do dado de acordo com esse formato.

 

Para ler não importa qual usamos... fscanf, fread etc etc

Importa sim. Importa pelo fato da saída ser diferente entre fwrite e fprintf. Trabalhar com bytes puros não é a mesma coisa que trabalhar com dados já formatados.
Sobre o modo binário:
"The mode string can also include the letter 'b' either as a last character or as a character between the characters in any of the two-character strings described above. This is strictly for compatibility with C89 and has no effect; the 'b' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the 'b' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-UNIX environments.)"

Compartilhar este post


Link para o post
Compartilhar em outros sites
Desculpa aí, mas o formato do arquivo (distribuição dos dados) importa sim. O que não *deveria* importar é a *extensão*, mas cada sistema operacional identifica o arquivo de um jeito diferente.

 

 

O erro foi meu, devia ter dito extensão, e me saiu formato. Erro meu.
Não. Ela faz o print de acordo com o formato especificado porque há a "interpretação/conversão" do dado de acordo com esse formato.

 

Em nenhum momento eu falei que ela trabalha mal. Elas tem diferentes formas de fazê-lo.

 

Importa sim. Importa pelo fato da saída ser diferente entre fwrite e fprintf. Trabalhar com bytes puros não é a mesma coisa que trabalhar com dados já formatados.

 

 

Eu disse para ler não e para escrever, fwrite e fprintf são para escrever/guardar os dados. Más por outro lado eu coloquei que sempre é bom usar sua parceira, não? Al menos é o que eu faria.

Sobre o modo binário:
"The mode string can also include the letter 'b' either as a last character or as a character between the characters in any of the two-character strings described above. This is strictly for compatibility with C89 and has no effect; the 'b' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the 'b' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-UNIX environments.)"

 

Isso que posteaste esta muito bem, conhecimento nunca é de más. Ainda que não sei da onde é esse dado.

 

Bom ja vejo que tenho que falar com fundamentos. Agora eu vou colocar aqui algo para que leias.

 

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

Internamente, a função interpreta o bloco apontado por ptr como se fosse uma matriz de (size*count) elementos do tipo char(más poderia ser int, float...) sem signo, e escrevê-las sequencialmente para transmitir como se fputc fosse chamado para cada byte. //copia Byte a Byte

 

int fprintf ( FILE * stream, const char * format, ... );

Writes the C string... BAM! Já temos o que precisamos.

Uma escreve Byte a Byte ao arquivo, mantendo o formato int, float etc, e a outra escreve um c_string char a char(que não deixa de ser Byte a Byte) más o fato de que ocupem o mesmo não quer dizer nada, pois um Byte de um inteiro não é um char.

 

A info esta aqui:

http://www.cplusplus.com/reference/cstdio/fwrite/

http://www.cplusplus.com/reference/cstdio/fprintf/

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou normal aqui comigo, mesmo sem extensão do arquivo (estou no Linux).

 

Dica p/ vcs não perderem tempo criando mensagens p/ todos os casos:

http://linux.die.net/man/3/fopen

 

Leiam as seções "Return value" e "Errors". Reparem que em caso de erro a função retorna NULL e define uma variável chamada errno. As definições podem ser encontradas em errno.h (http://linux.die.net/man/3/errno)

O código ficaria assim:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main () {
    FILE *arqv;
    int a;
 
    arqv = fopen("teste", "r");
    if (!arqv) {
    	printf("ERROR: %s\n", strerror(errno));
    	return 1;
    }
    fscanf(arqv, "%i", &a);
    printf("%i", a);
    fclose(arqv);
    return 0;
}

E a saída (mensagem de erro) informada ali no printf dependendo do caso:

1- Arquivo inexistente: ERROR: No such file or directory

2- Permissões insuficientes (não tenho permissão de leitura no arquivo): ERROR: Permission denied

 

Deixe o sistema indicar o que aconteceu ao realizar a operação.

Muito obrigado pelas dicas, Isis!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.