Jump to content
Joao Miguel

Realocar String

Recommended Posts

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.

Share this post


Link to post
Share on other sites
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á ...

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites
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().

Edited by 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%.

Share this post


Link to post
Share on other sites
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.

Edited by Joao Miguel

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
HappyHippyHippo

já alguma veste escreveste um algoritmo onde deliberadamente não colocaste alguns elementos ?


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

Share this post


Link to post
Share on other sites
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...

Share this post


Link to post
Share on other sites
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 ...

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

mete no teu código comentários a dizer o passo que foi implementado, e depois diz que fizeste tudo


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


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