Ayuda con Codigo C

K

Tengo que entregar un codigo para la universidad que me gestione los datos de una serie de canales dde television y los guarda en ficheros.

El programa debe realizar las siguientes opciones:

  1. Añadir un canal a la plataforma digital. No se permite que se duplique el código del canal.
  2. Borrar un canal de la plataforma digital.
  3. Mostrar los canales almacenados.
  4. Recuperar un canal.

El borrado del canal es tan solo sustituir en los datos un NO por un SI.

Tengo que usar struct por cojones.

Esta es la página del problema http://webpages.ull.es/users/lmmoreno/fi/practicas/prac9.pdf

El código que tengo hasta ahora (sin terminar) es este:

#include <stdio.h>
#include <string.h>
#define MAX 20

typedef struct{
int codigo;
char nombre[MAX];
int audiencia;
char borrado[2];
} Tcanales;

Tcanales datosCanal;

int BuscarCanal(int codigo, char fichero[]){

FILE *leerDatos;

leerDatos=fopen(fichero, "r");
if(leerDatos!=NULL){
    while(fscanf(leerDatos, "%d %s %d %c\n", &datosCanal.codigo, datosCanal.nombre, &datosCanal.audiencia, datosCanal.borrado)!=EOF){
        fscanf(leerDatos,"%d %s %d %s\n", &datosCanal.codigo, datosCanal.nombre, &datosCanal.audiencia, datosCanal.borrado);
        if(codigo==datosCanal.codigo)
            return 1;
        else
            return 0;
    }
}
else
        printf("Error de apertura del archivo");
fclose(leerDatos);

}

void AdicionCanal(void){

char fichero[MAX];
int encontrado=1;
FILE *introducirDatos;

printf("\n\nIntroduce el nombre del fichero en el que vas a guardar los datos: ");
scanf("%s", fichero);
introducirDatos=fopen(fichero, "a");
if(introducirDatos!=NULL){
    printf("\nIntroduce el codigo del canal: ");
    scanf("%d", datosCanal.codigo);
    encontrado=BuscarCanal(datosCanal.codigo, fichero);
    if(encontrado==1)
        printf("\n\nEl codigo del canal ya existe.\n\n");
    else{
        printf("\nIntroduce el nombre del canal: ");
        scanf("%s", datosCanal.nombre);
        printf("\nIntroduce la audiencia del canal: ");
        scanf("%d", &datosCanal.audiencia);
        fprintf(introducirDatos, "%d %s %d N\n", &datosCanal.codigo, datosCanal.nombre, &datosCanal.audiencia);
        printf("\n");
    }
}
else
        printf("Error de apertura del archivo.");
fclose(introducirDatos);

}

void BorradoCanal(void){

int encontrado, codigo;
char nombreFich[MAX];
FILE *fich;
FILE *temp;

printf("\nIntroduce el nombre del fichero en el que se encuentran los datos: ");
scanf("%s", nombreFich);
fich=fopen(nombreFich,"r+");
temp=fopen("Temporal.txt","w+");
if((fich!=NULL)&&(temp!=NULL)){
    printf("\n\nIntroduzca el codigo del canal a buscar: ");
    scanf("%d", &codigo);
    encontrado=BuscarCanal(datosCanal.codigo, nombreFich);
    if(encontrado==1){
         while(fscanf(fich,"%d %s %d %s\n", &datosCanal.codigo, datosCanal.nombre, &datosCanal.audiencia, datosCanal.borrado)!=EOF){
             fscanf(fich,"%d %s %d %s\n", &datosCanal.codigo, datosCanal.nombre, &datosCanal.audiencia, datosCanal.borrado);
             if(codigo==datosCanal.codigo)
                 fprintf(temp,"%d %s %d S\n", datosCanal.codigo, datosCanal.nombre, datosCanal.audiencia);
             else
                 fprintf(temp,"%d %s %d N\n", datosCanal.codigo, datosCanal.nombre, datosCanal.audiencia);
         }
         while(fscanf(temp,"%d %s %d %s\n", &datosCanal.codigo, datosCanal.nombre, &datosCanal.audiencia, datosCanal.borrado)!=EOF){
             fscanf(temp,"%d %s %d %s\n", &datosCanal.codigo, datosCanal.nombre, &datosCanal.audiencia, datosCanal.borrado);
             fprintf(temp,"%d %s %d %s\n",  datosCanal.codigo, datosCanal.nombre, datosCanal.audiencia, datosCanal.borrado);
         }
         printf("\n\nEl canal ha sido borrado");
		
	}
	else
        printf("El codigo no se ha encontrado en el archivo de datos.");
        
fclose(fich);
fclose(temp);
}
	
else
	printf("Error de apertura del archivo.");

}

void MostrarCanal(void){

char nombreFich[MAX];
FILE *fich;

printf("Introduce el nombre del fichero en el que se encuentran los datos: ");
scanf("%s", nombreFich);
fich=fopen(nombreFich,"r");
if(fich!=NULL){
    while(fscanf(fich,"%d %s %d %s\n", &datosCanal.codigo, datosCanal.nombre, &datosCanal.audiencia, datosCanal.borrado)!=EOF){
        fscanf(fich,"%d %s %d %s", &datosCanal.codigo, datosCanal.nombre, &datosCanal.audiencia, datosCanal.borrado);
        if(datosCanal.borrado=="N")
            printf("Codigo: %d     Nombre Canal: %s     Audiencia: %d");
        else;
    }
}
fclose(fich);

}

void menu(void){
int menu;
while(menu!=6){
printf("Gestor de canales.\n1. Aniadir canal.\n2. Borrar canal.\n3. Mostrar canales\n4. Recuperar un canal.\n5. Borrado automatico de canales.\n6. Salir.\n\nOpcion: ");
scanf("%d", &menu);
switch(menu){
case 1:
AdicionCanal();
break;
case 2:
BorradoCanal();
break;
case 3:
MostrarCanal();
default:
printf("\n\nIntroduce una de las opciones disponibles.");
}
}
}

int main(void){
menu();
}

El tema es que no realiza las opciones que le pido que realice... En el fichero de datos no guarda el codigo del canal ni la audiencia y tampoco detecta si el codigo esta repetido.

Agradeceria cualquier tipo de ayuda.

Edito: Aqui esta mas claro

http://pastebin.com/865434

javithelong

scanf("%d", datosCanal.codigo);

¿Esto mete el entero en datosCanal?
Otra cosa, ¿eres informático? porque las variables globales no nos gustan a los informáticos... (si tu profe es informático...)

No se, debuggea un poco, busca algo, indica donde crees que esta el error, que plantes un código enorme asi y pidas ayuda me parece un poco heavy. Este foro se esta convirtiendo en "os pongo mi práctica y me la dais hecha"...

dr_Rouman

#2 Jajaj, te juro que he pensado lo mismo con lo de la variable global. Pero en la práctica pone que es de Industriales, así que se le tolera xD

No tengo ganas de estudiar física, cuando desayune me pongo a probarla, a ver si saco algo...pero podías concretar un poquito más O_o

javithelong

fprintf(introducirDatos, "%d %s %d N\n", &datosCanal.codigo, datosCanal.nombre, &datosCanal.audiencia);

Esto tampoco funciona, me parece a mi, lo de los & en los scanf lo han preguntado 27 veces esta última semana, y en el fprintf, esos & sobran, prueba esto:

fprintf(introducirDatos, "%d %s %d N\n", datosCanal.codigo, datosCanal.nombre, datosCanal.audiencia);

dr_Rouman

Si pones un ampersand (&) en el fprintf lo único que vas a conseguir es meter la dirección de memoria en el fichero, en lugar del dato que corresponde.

R

en los scanf debes poner & y en los printf no.

PD: no me he mirado el codigo , da palo :(

Dod-Evers

Qué codigos más feos quedan con c,...
Mira, haz otra cosa, que iwal te es más facil. Crea un vector de canales.
Cuando quieras insertar uno, lo metes al vector.
Cuando quieras leer los canales, lees el vector.
Cuando quieras ver si hay alguno repetido, lo miras en el vector.

Por lo que el problema se reduce bastante.
Se queda en dos más pequeños.

  1. - Manipulación de vectores:
    vectorCanales.codigoCanal etc...

  2. - Manipulación de ficheros:
    Abrir, cerrar, leer todo, escribir todo.

Mira a ver si de esta manera lo sacas. Con lo que tienes sólo tienes que añadir el vector y quitar las cosas feas esas de los ficheros, i mirate el fopen con las opciones +a +b.. etc.

Ya dirás!

Usuarios habituales