Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

Joao Miguel

Realocar String

Mensagens Recomendadas

Joao Miguel    1
Joao Miguel

Boa noite.

Passo a apresentar um excerto de código:

#define MAX_BUF_SIZE 1024

FILE *f;
FILE *novo_f;

char buf[MAX_BUF_SIZE];											
char novo_buff[MAX_BUF_SIZE];

if((f = fopen("lista.txt", "r")) != NULL) {
 while(fgets(buf, sizeof(buf), f)) {									  

	  if((novo_f = fopen(buf, "r")) != NULL) {				

		   while(fgets(novo_buff, sizeof(novo_buff), novo_f)) {
				...

A string novo_buff tem tamanho 1024. Contudo, este tamanho pode não chegar caso a linha lida seja maior.

O que pretendo é que se a linha não tiver sido lida até ao fim, realocar espaço para a string novo_buff.

Eu sei que existe uma função que é realloc mas não sei como utiliza-la.

Se alguém pode-se dizer uma especie de step by step como fazer isto agradecia.

Obrigado.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

step by step (sem código de verificação de sucesso de chamadas) :

- alocar um bloco de memória com um tamanho definido (malloc)
- atribuir o vaor de zero a uma variável auxiliar (indice)
- ciclo
 - ler com fgets na posicao "indice" do array
 - determinar se a string lida termina no caracter '\n'
 - se sim
    - retirar o caracter '\n' e marcar o ciclo como terminado
 - se não
    - realocar o array para um tamanho maior
    - incrementar o valor da variável auxiliar "indice" para o número de dados lidos e guardados no array

... já está ...

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
brunoais    67
brunoais

1 dica extra:

Tanto quanto sei, por causa da maneira como a maneira como a memória na stack é alocada, não é possível alterar o tamanho de memória alocada.

Em vez disso, deves alocar a memória na heap usando o malloc().

Editado por brunoais

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Joao Miguel    1
Joao Miguel

Fiz o seguinte:


#define MAX_BUF_SIZE 1024

FILE *f;
FILE *novo_f;

char buf[MAX_BUF_SIZE];											
char *novo_buff;
int i = 0;

if((f = fopen("lista.txt", "r")) != NULL) {
 while(fgets(buf, sizeof(buf), f)) {									  

	  if((novo_f = fopen(buf, "r")) != NULL) {

		   novo_buff = malloc(1024);

		   while(fgets(novo_buff, sizeof(novo_buff), novo_f)) {

				while((novo_buff[i] != '\0') && (novo_buff[i] != '\n')) i++;
				if(novo_buff[i] != '\n')
				{
					 realloc(novo_buff, 1024);
					 fgets(novo_buff[i], sizeof(novo_buff), novo_f);
				}

				...

Não está a funcionar, alguma dica do que esteja mal?

P.S. A forma como fiz só está a realocar uma vez, partindo do principio que uma vez so chega. Não vai chegar mas para já o que quero mesmo é por a realocar pelo menos uma vez, para mais que uma é so fazer umas alterações, não vale a pena estar a "complicar" aqui o código pois assim percebe-se melhor.

Obrigado.

Editado por Joao Miguel

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Joao Miguel    1
Joao Miguel

Uma versão do que escreves-te porque não percebi muito bem o que querias dizer com:

- alocar um bloco de memória com um tamanho definido (malloc)

- ler com fgets na posicao "indice" do array

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Joao Miguel    1
Joao Miguel

Penso que não, se esses elementos são necessários para o algoritmo não vejo razão para não os colocar.

Mas não estou a perceber onde queres chegar com a pergunta...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

Penso que não, se esses elementos são necessários para o algoritmo não vejo razão para não os colocar.

Mas não estou a perceber onde queres chegar com a pergunta...

porque foi exactamente isso que fizeste como o algoritmo que te foi apresentado ...

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.