Ver Mensaje Individual
  #3 (permalink)  
Antiguo 07/04/2013, 05:06
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: de un fichero a un vector

O con una lista de strings delimitadas por nulos, tal vez no sea ni mas facil ni mas eficiente pero personalmente me parece mas divertido :)

Código:
char *llegirFitxer0(char *nom, int *ctd) {
	char cadena[100];
	char *bff, *mem;
	FILE *f;
	unsigned long tam, pre, nul;
	
        //aqui falta la comprovación de error para apertura de archivo
	f = fopen(nom, "r");
	
	bff = NULL;
	pre = 0;
	tam = 0;
	*ctd = 0;
	while(fgets(cadena, 100, f) != NULL) {
		pre = tam;
		tam += (strlen(cadena)+1);
		nul = pre+strlen(cadena);
		
		if(!bff) {
                        //aqui falta la comprovacion de error para reserva de memoria
			bff = malloc(tam);
			bff[0] = '\0';
		}
		else {
                        //aqui tambien falta la comprovacion de error para reserva de memoria
			mem = realloc(bff, tam);
			bff = mem;
		}
		
		sprintf(bff+pre, cadena);
		bff[nul] = '\0';
		*ctd += 1;
	}
	
	return bff;
}


char *portarElement(char *bff, int pos) {
	int q;
	for(q = 0; q < pos; q++) {
		bff += (strlen(bff)+1);
	}
	return bff;
}


int main() {
	char *dades;
	int elements_carregats, posicio;
	
	if((dades = llegirFitxer0("test.txt", &elements_carregats))) {
		for(posicio = 0; posicio < elements_carregats; posicio++) {
			printf("%d\t%s", posicio, portarElement(dades, posicio));
		}
		free(dades);
	}
	
	return 0;
}
Esto genera un array de caracteres como este:
Código:
'h','o','l','a','salto linea','nulo','q','u','e','salto linea','nulo','t','a','l','nulo'
Existe tambien la version de doble nulo al final, para no tener que arrastrar el contador de elementos.

En cualquier caso creo tambien deberias tener en cuenta otra observacion: el fgets carga datos hasta la longitud indicada o hasta que encuentra un caracter de nueva linea o hasta llegar al final del archivo, eso significa que todas las frases (o palabras o lo que tangas) si no miden exactamente 100 caracteres (y ademas se supone que BUFSIZE >= 100) van a terminar todas con un salto de linea, con lo que tal vez tambien te interese implementar una funcion que elimine esos caracteres finales.

Saludos
vosk