Ir ao conteúdo
  • Cadastre-se
EribertoTorres

c: Gravacao e leitura em um arquivo de texto

Recommended Posts

Boa tarde colegas.

Essa é a primeira vez que avanco meus estudos de C, incluso aprendi o que sao ponteiros, como usar e para que servem, mas ainda me falta prática com a linguagem. Fiz (pela terceira vez) um curso online de Linguagem C pelo CDTC (comunidade.cdtc.org.br), e no exercício final, é pedido para fazer a leitura de um arquivo de texto, manipular uma sequência de bits, codificar em base 64 e depois decodificar.

Eu entendi o que foi pedido e na teoria sei o que fazer, mas esbarrei no primeiro passo (talvez pela forma como eu queira fazer).

Eu gostaria de pedir para o usuário digitar uma cadeia de caracteres e ou números (strings ou números inteiros) e que isso fosse exibido na tela (printf) e gravado em um arquivo de texto (fprintf), e que esse arquivo de texto eu pudesse abrir com um editor de texto (nao é exigência do curso, mas queria aprender fazer isso, porque tenho em mente outros projetos e essa parte me será útil no futuro).

O que eu consegui fazer (primeiro programa) e o que eu consegui copiando um exemplo (segundo programa)

/* Programa criado por Eriberto Torres de Oliveira */
/* Versao 0.01 #01/09/2013# */
/* Programa para criacao de arquivos (codificacao) em base 64 */
/* Atendendo o requerido no curso de Linguagem C do CDTC */

/* Inclusao das Bibliotecas */

#include <stdio.h> /* Biblioteca padrão de entrada e saída */

int main () { /* funcao principal do programa */

/* A primeira parte consiste em ler 3 bytes do arquivo de origem
Para tal, devemos primeiro verificar que o arquivo existe, caso nao exista, deverá ser criado */

/* O nome do arquivo será origem.txt */

FILE* arqInteiros1 = NULL;

int i;

/* Tenta abrir o arquivo */
if((arqInteiros1 = fopen("origem.txt", "r+")) == NULL);

// printf ("Houve um erro ao abrir o arquivo e/ou na criacao do arquivo."\n "Verifique se você tem permissao para tal")

/* Para testar, vamos escrever de 1 a 100 no arquivo */
for (i=0; i<100; i++) fwrite( &i, sizeof(int),1,arqInteiros1);

fclose(arqInteiros1);

printf ("Arquivo fechado com sucesso");


return (0);

}

#include <stdio.h>

int main ( int argc, char **argv )
{
FILE *fp;

char buffer[100] = "Esto es un texto dentro del fichero.";
int i=0;

fp = fopen ( "fichero.txt", "w+" );

fprintf(fp, buffer);
fprintf(fp, "%s", "\nEsto es outro texto dentro del fichero.");
for (i=0; i< 10; i++);
printf (&i);
fclose ( fp );

return 0;
}

O segundo faz o que eu quero, mas com texto, mas nao tenho a interacao que eu gostaria de adicionar.

Como fazer essa gravaao? Tentei com wt, wb, w+ e todos tem o mesmo resultado (um arquivo binário).

E também, para finalizar: como estou usando ponteiros, e pelo que aprendi no curso, tenho que sempre liberar a área de memória onde está sendo usada pelo ponteiro: como liberar da melhor forma? Em que momento uso a instrucao Free?

Agradeco desde já a ajuda.

Eriberto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu fiz abaixo um código que lê uma string qualquer do usuário e salva essa string num arquivo texto (cujo nome será passado via linha de comando no momento da execução).

Se eu entendi bem o que você quer, esse código pode auxiliá-lo.

O seu problema, eu acredito, estava na escrita dos dados com a função fwrite, que, geralmente, é usada para arquivos binários, e não de texto.

Nos arquivos textos, preferencialmente usamos a fprintf.

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

char *ReadLine(FILE *stream);

int main (int argc, char *argv[])
{
FILE *arq;
char *texto = NULL;

if(argc != 2)
{
printf("Como usar: ./arqcompilado nome_do_arquivo_de_saida");
exit(0);
}

if((arq = fopen(argv[1], "w+")) == NULL)
{
printf("Erro ao abrir o arquivo");
exit(0);
}

texto = ReadLine(stdin);

fprintf(arq, "%s", texto);

free(texto);
fclose(arq);

return 0;
}

char *ReadLine(FILE *stream)
{
char *text = NULL;
int counter = 0, c;

do
{
text = (char *) realloc(text, sizeof(char) * (counter+1));
c = fgetc(stream);
text[counter] = c;
counter++;

} while(c != '\n');

text[counter - 1] = '\0';

return text;
}

Você pode usar a função free quando não precisar mais do conteúdo apontado por um ponteiro. Geralmente, coloca-se no final do código, mas se você não for mais usar determinado dado, é até aconselhável liberar essa memória antes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×