Foros del Web » Programación para mayores de 30 ;) » C/C++ »

de un fichero a un vector

Estas en el tema de de un fichero a un vector en el foro de C/C++ en Foros del Web. Buenas!! Necesito meter los datos de un fichero en un array, tengo la siguiente funcion que tendria que devolver en un array de los datos ...
  #1 (permalink)  
Antiguo 06/04/2013, 13:15
 
Fecha de Ingreso: marzo-2013
Mensajes: 19
Antigüedad: 11 años, 8 meses
Puntos: 0
de un fichero a un vector

Buenas!!
Necesito meter los datos de un fichero en un array, tengo la siguiente funcion que tendria que devolver en un array de los datos de un fichero (el nombre pasado por paràmetro):

char llegirFitxer0(char *nom){

char cadena[BUFSIZE];
char cadena2[BUFSIZE];

FILE *f = fopen(nom,"r");

while (fgets(cadena, 100, f) != NULL)
{
strcpy(cadena2,cadena);
}
printf("nom:%s\n",cadena2);


}
pero cada vez que lee una linea me machaca el valor de cadena2. El objetivo es meter los datos del fichero en un array, y no se si hay otra manera más facil i eficiente.

Gracias!!
  #2 (permalink)  
Antiguo 06/04/2013, 17:48
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 11 meses
Puntos: 35
Respuesta: de un fichero a un vector

Hola. La pregunta es, donde está el array? Tienes un array de caracteres, que sería una cadena, y cada vez que llamas a la función strcpy te está copiando en cadena2 la línea por la que va leyendo. Lo que necesitas un array de un array de caracteres, para almacenar cada línea:

Código C:
Ver original
  1. char array[numero_lineas][BUFSIZE];

Espero que te sirva!

  #3 (permalink)  
Antiguo 07/04/2013, 05:06
 
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
  #4 (permalink)  
Antiguo 07/04/2013, 05:29
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 5 meses
Puntos: 28
Respuesta: de un fichero a un vector

Por último, la versión de C++:

Código:
string llegirFitxer0(char *nom){

string cadena;
string cadena2[BUFSIZE];

int i = 0;

FILE *f = fopen(nom,"r");

while (fgets(cadena, 100, f) != NULL)
{
cadena2[i] = cadena;
i++;
}

for (int j = 0; j < i;j++)
printf("nom:%s\n",cadena2[j].c_str());


}
  #5 (permalink)  
Antiguo 07/04/2013, 12:48
 
Fecha de Ingreso: marzo-2013
Mensajes: 19
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: de un fichero a un vector

Gracias por Responder ya me funciona :)

Etiquetas: fichero, funcion, vector
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:51.