#include "lectura.h" #include #include #include #include //funcion para ver si existe el fichero: //la función "Existe" tiene de parámetro un puntero a un carácter path int Existe(char * path) { FILE *fichero; // Declaro un puntero a un fichero fichero = fopen(path,"r"); if (fichero == NULL) { printf("No existe el fichero\n"); return 0; } else { printf("\n"); printf("\n"); return 1; } } //--------------------------------------------------------------------------------------------------------- //Esta funcion nos devuelve la posición en la cadena: int posicion(char *cadena,char caracter,int posi) { char *p; //desplazarnos por la cadena p = cadena + posi; //posicion inicial desde la que empieza a buscar if((p = strchr(p,caracter))!=NULL) //strchr permite buscar caracteres enc adenas, //localiza la pimera ocurrencia de un caracter 'caracter' en un cadena return p - cadena; // me devuelve la posicion de la cadena else return -1; // si no lo encuentra me devuelve -1 } // Si p es distinto de cero // donde p es la posicion de un caracter, es decir siempre, porque es una cadena de caracteres. //--------------------------------------------------------------------------------------------------------- //Esta función va leyendo por fila int leerfichero(char *path,variable *datos) // Nos lee el fichero y nos devulve el nº de datos por variable { // FIle es una estructura de control de archivo para flujos FILE * fichero; //Puntero "fichero" a un archivo char cadena [200]; int i,pinicial,parentesis,k; //Se abre un fichero de texto para lectura fichero = fopen(path, "r"); i=0; //La funcion feof comprueba el indicador de final de fichero para el stream // retorna un valor distinto a cero si el indicador de final de fichero está activado while (feof (fichero) == 0) { // FGETS lee como máximo uno menos que el número de caracteres indicados (200) // desde stream, apuntado por "fichero" el array apuntado por "cadena" fgets (cadena,200,fichero); //Ahora leemos dentro de cada cadena los distintos valores de las diferentes variables //Dentro de este 'if' leemos las primeras 5 lineas if (i<5) { //leemos el nombre //ser retorna el numero de caracteres escritos en el array, sin contar el nulo del final sprintf(datos[i].nombre,"%s",subcadena(cadena,0,posicion(cadena,'\t',0))); parentesis = posicion(cadena,'(',0); datos[i].min = atof(subcadena(cadena,parentesis+1,posicion(cadena,' ',parentesis))); //Atof convierte la porción inicial de cadena apuntada, en una representación double // Estamos cogiendo la subcadena, de la cadena,donde la posi es par+1 y la posf es la posición del caracter espacio //del caracter espacio, es decir leemos el minimo datos[i].max = atof(subcadena(cadena,posicion(cadena,'a',parentesis+1)+2,posicion(cadena,')',parentesis+1))); } //Dentro de este 'if' leemos todos los valores de las diferentes variables if (i>5) { pinicial = 0; //inicializamos la posicion inicial //desde donde partimos para leer //cada dato de las diferentes variables for (k=0;k<4;k++) { datos[k].valores[i-6] = atof(subcadena(cadena,pinicial,posicion(cadena,'\t',pinicial))); pinicial = posicion(cadena,'\t',pinicial)+1; } datos[4].valores[i-6] = atof(subcadena(cadena,pinicial,strlen(cadena))); } i++; } return (i-6); } //-------------------------------------------------------------------------------------------------------------------------- //Funcion subcadena: //me va dando la subcadena char *subcadena(char *cadena,int posi,int posf) { int i,l; //Con puntero sería: //char *resultado; //resultado =(char*)malloc(sizeof(char)*(posf-posi+1)); // Dejamos un espacio igual al rango mas 1 para el puntero resultado char resultado[100]; for (i=0;i<(posf-posi);i++) { resultado[i] = cadena[posi+i]; } resultado[i]='\0';// indicas final de la cadena return resultado; } //----------------------------------------------------------------------------------------------------------------------------- void ordena(int N,variable *datos) { double temp; int i,j,k; for (k=0;k<5;k++) { for (i=0;i