Ir ao conteúdo
  • Cadastre-se

c: Gravacao e leitura em um arquivo de texto


EribertoTorres

Posts recomendados

  • Membro VIP

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

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

Arquivado

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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...