Jump to content

Recommended Posts

Posted

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.

Posted (edited)

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
Posted (edited)

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

Posted (edited)

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
Posted (edited)

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.