[C con Clase] Guardado de valores en Array desde archivo plano.

Manuel SoftMpr softmpr en gmail.com
Sab Ene 24 18:01:35 CET 2015


Buenas tardes a todos.
Tengo un problema que espero me podáis ayudar en su solución.

Necesito recuperar unos datos desde un archivo plano generado
automáticamente. Se trata de un fichero que contiene registros de
temperatura y la hora de lectura de la misma.
Mi intención es separar ambos datos, y llenar dos Arrays con ellos, uno
para las fechas y otro para las temperaturas.
Para ello he implementado el código adjunto, pero el array, solo se llena
de datos con la lectura de última fecha.
Sé que es cuestión de que estoy enviando datos al array desde posiciones de
memoria incoherentes, pero no encuentro la manera de corregirlo.
En el código que adjunto solo he implementado el array de fechas, con el
objeto de simplificar la lectura, no obstante, estoy convencido que
solucionando éste, el otro quedará resuelto, pues es cuestión de repetir el
proceso.
En el archivo.zip adjunto se encuentra el proyecto C::B y el archivo plano.

Hace años que sigo vuestra web y también esta lista, aunque no he tenido
necesidad usarla antes, no quiero dejar pasar la oportunidad de agradeceros
los conocimientos que tan generosamente compartís y que tan útiles me han
sido otras veces.

Muchísimas gracias de antemano por vuestra atención.
Atentamente,

Manuel Protasio.

Código del programa
###############


  #include <stdio.h>
#include <ctype.h>
#include <string.h>

using namespace std;

FILE *fichero;
char *MATRIZ_FECHAS[30];
char nueva_fecha[]="fechafechafech";
int contador_de_fechas_distintas=0;

void AbrirFichero();
void VisualizarImagenDeFichero();
void CerrarFichero();
void VisualizarSoloLasFechas();
void Guardar_En_MATRIZ_FECHAS(char nueva_fecha[],int numero_registro);
void Visualizar_MATRIZ_FECHAS(int cantidad_de_registros);

int main()
{
    AbrirFichero();
    // Imprime por pantalla una imagen del fichero
    VisualizarImagenDeFichero();
    CerrarFichero();
    AbrirFichero();
    // Imprime por pantalla las fechas existentes en fichero
    VisualizarSoloLasFechas();
    CerrarFichero();
    // Deberia imprimir las fechas guardadas anteriormente en la matriz
    // pero solo imprime la última fecha en todos los registros de la matriz
    Visualizar_MATRIZ_FECHAS(contador_de_fechas_distintas);
    return 0;
}

void AbrirFichero()
{

    if ((fichero=fopen("fichero_a_tratar.dat","a+"))==NULL)
    {
        printf("Error: no se pudo abrir en fichero");
    }
}
void CerrarFichero()
{
    fclose(fichero);
}
void VisualizarImagenDeFichero()
{
    printf("\n=============== Impresion de imagen de fichero  =========\n");
    while(!feof(fichero))
    {
        fputc(fgetc(fichero), stdout);
    }
}
void VisualizarSoloLasFechas()
{
    printf("\n=============== Impresion de las fechas del fichero
=========\n");
    char caracter_leido;
    int contador_posicion_nueva_fecha=0;
    bool es_el_inicio_de_una_fecha=false;
    while (!feof(fichero))
    {
        caracter_leido=fgetc(fichero);

        if (caracter_leido=='<')
        {
            es_el_inicio_de_una_fecha=true;
        }
        if (es_el_inicio_de_una_fecha)
        {


            if (contador_posicion_nueva_fecha>=2 &&
contador_posicion_nueva_fecha<=15)
            {

                nueva_fecha[contador_posicion_nueva_fecha-2]=caracter_leido;
            }
            contador_posicion_nueva_fecha++;
        }
        if (caracter_leido=='>')
        {
            // Guarda la nueva fecha en la matriz

Guardar_En_MATRIZ_FECHAS(nueva_fecha,contador_de_fechas_distintas);
            contador_posicion_nueva_fecha=0;
            contador_de_fechas_distintas++;
            printf("\n%s",nueva_fecha);
            es_el_inicio_de_una_fecha=false;
        }

    }

}
void Guardar_En_MATRIZ_FECHAS(char fecha[],int numero_registro)
{
    MATRIZ_FECHAS[numero_registro]=fecha;

}
void Visualizar_MATRIZ_FECHAS(int cantidad_de_registros)
{
    printf("\n=============== Impresion del volcado del Array
=========\n");
    printf("=========== el cual deberia mostrar fechas distintas =====\n");
    for (int k=0; k<cantidad_de_registros; k++)
    {
        if (MATRIZ_FECHAS[k]!=NULL)
        {
            printf("\nValor de MATRIZ_FECHAS[%d] = %s",k,MATRIZ_FECHAS[k]);

        }
        else
        {
            printf("\nFin de la visualización");
            k=cantidad_de_registros;
        }
    }

}


#######

Fichero plano:
#########

< 22/01/15 22:36 >
     71
< 22/01/15 22:37 >
     71
< 22/01/15 22:38 >
     71
< 22/01/15 22:39 >
     71
< 22/01/15 22:40 >
     71
< 22/01/15 22:41 >
     71
< 22/01/15 22:42 >
     71
< 22/01/15 22:43 >
     71
< 22/01/15 22:44 >
     71
< 22/01/15 22:45 >
     71
< 22/01/15 22:46 >
     71
< 22/01/15 22:47 >
     71
< 22/01/15 22:48 >
     71
< 22/01/15 22:49 >
     71
< 22/01/15 22:50 >
     71
< 22/01/15 22:51 >
     71
< 22/01/15 22:52 >
     71
< 22/01/15 22:53 >
     71
< 22/01/15 22:54 >
     71
< 23/01/15 17:16 >
     63
< 23/01/15 17:17 >
     63
< 23/01/15 17:18 >
     63
< 23/01/15 17:19 >
     63
< 23/01/15 17:20 >
     63
< 23/01/15 17:21 >
     63
< 23/01/15 17:22 >
     63
< 23/01/15 17:23 >
     63
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150124/bf93e38f/attachment.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: leer_tratar_archivo.zip
Type: application/zip
Size: 12547 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150124/bf93e38f/attachment.zip>


Más información sobre la lista de distribución Cconclase