Programa que lea un fichero y ejecute órdenes en consecuencia.

Iniciado por ZHOSS-9, 21 Noviembre 2011, 21:21 PM

0 Miembros y 1 Visitante están viendo este tema.

ZHOSS-9

Buenas. Estoy creando un programa que lea un fichero .txt (que él mismo creará) y a partir de lo que ponga en ese fichero, hará una cosa u otra.

He empezado a programar en C++ hace apenas nada, no llega a una semana. Sin embargo ya estaba familiarizado de antes con PHP y C++, solo que este último no lo di apenas en profundidad y también fue por muy poco tiempo.

Estoy haciendo al mismo tiempo un curso que estoy leyendo en internet, asi que es normal si veis errores gordos por ahí.. aunque el código me compila sin problemas y se ejecuta todo. Lo que pasa es que no me da el resultado esperado:

[He puesto varios Sleep() para que cuando se ejecute el programa, saber que está pasando paso por paso].

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <fstream>

using namespace std;

int main()
{
        char* acts;
        bool estan;
        char* num;

     //creamos el archivo .txt donde almacenar las actualizaciones instaladas.
     // Si ya existe simplemente lo abre

        cout << "Analizando archivo de actualizaciones.." << endl;
        Sleep(1000);
        FILE *fichacts;
        fichacts = fopen("getActs.txt", "a");
        cout << "Fichero analizado. ";
        Sleep(1000);



        cout << "Leyendo la informacion del fichero." << endl;
        Sleep(342);
        rewind(fichacts);
        // Fichero rebobinado al principio
        // Ahora lee el contenido
        // El contenido del archivo lo guarda en una variable llamada acts

            acts = fgets(acts, 7, fichacts);

            // Metemos la condición para leer que está instalado
            switch (*acts) {
            case 'ps1000': printf("Esta instalado ps1000.\n");
            case 'ps1001': printf("Esta instalado ps1001.\n");
            case 'ps1002': printf("Esta instalado ps1002.\n");
            case 'ps1003': printf("Esta instalado ps1003.\n");
            case 'ps1004': printf("Esta instalado ps1004.\n");
            case 'ps1005': printf("Esta instalado ps1005.\n");
            case 'ps1006': printf("Esta instalado ps1006.\n");
            case 'ps1007': printf("Esta instalado ps1007.\n");
            case 'ps1008': printf("Esta instalado ps1008.\n");
            case 'ps1009': printf("Esta instalado ps1009.\n");
                break;
            default:
                printf("No esta correcto..\n");
            }
        system("pause");
        return 0;
}


La finalidad de todo esto es que el programa cree un archivo .txt . En ese archivo txt puede que no haya nada, o puede que ya haya algo escrito, que en este caso sería ps1000, ps1001...
Lo que yo busco es que el programa lea el archivo.txt, y que si pone ps1000, ps1001, ps1002, etc. muestre que está instalado ese pack, y que si no, que muestre el mensaje 'No esta correcto..'.

En todos los casos, aún habiendo escrito yo ps1000 en el .txt, me muestra siempre 'No esta correcto..', pero sin embargo si que hay contenido en el .txt

¿A qué se debería? Desde ya gracias!

do-while

¡Buenas!

Tienes varios errores:

Intentas leer a acts con fgets, pero esta variable es un puntero, en principio con un valor aleatorio (basura) por lo que no sabes a que direccion de memoria esta apuntando y es mas que posible que en algun momento estes intentando machacar datos del programa a los que no tengas acceso, por lo que el programa crasheara. Para evitar esto tendras que darle una dimension a la variable, bien sea dimensionandolo en la declaracion, char acts[CANTIDAD_DE_ELEMENTOS_QUE_QUIERAS_ALMACENAR], o asignando dinamicamente esa cantidad de elementos.

El segundo error lo tienes en el switch. El valor que discrimina los diferentes casos del switch tiene que ser un entero. Si acts es un puntero a caracter, *acts desreferencia el puntero, tomando el valor que haya en la direccion de memoria al que apunta, que en este caso sera el primer caracter de la cadena (que es un valor entero), pero luego, los casos que planteas son cadenas (que por cierto, deben ir encerradas entre comillas dobles, no simples) y las comparaciones no se podran evaluar.

Si quieres hacer comparaciones tendras que usar strcmp, que se encuentra en cstring, de esta forma:
Código (cpp) [Seleccionar]

if(strcmp(acts , "una cadena") == 0)
{
}
else if(strcmp(acts , "otra cadena") == 0)
{
}
//...
else
{
}


No se si me he explicado bien. Si buscas mas informacion a cerca de los punteros y la estructura switch, veras claramente donde esta el fallo.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

ZHOSS-9

Muchas gracias por la ayuda do-while :p
tienes razón, la verdad es que me he metido a programar esto (que ya he incluido punteros y demás) demasiado pronto. Estoy siguiendo los videotutoriales que vi por este foro y de momento voy por el capítulo 3.. y ya me he metido a manejar ficheros.

Iré corrigiendo el código con tu ayuda y conforme vaya aprendiendo con el curso.