Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Gallu

#151
Una cosa , el fichero rutas.dat solo contiene un registro? por que solo lees el primero de todos , por consiguiente aunque exitan más solamente compararás el dato introducido con el primer registro , estaría bien saber la estructura del fichero antes ...


Solución posible : cargar todos lo codigos de ruta en un array , y cuando metan el código mirar si existe o no , si no , llamar a la rutina de
grabación de registros , si existe mandar el mensaje indicandolo ... espero que te sirva

Prueba los siguiente , ya verás lo bien que va



#include <stdio.h>
#include <string.h>
#define NOMBRE_ARCHI "c:\\rutas.dat"
#define LIMPIA_BUFFER while(getchar()!='\n')


struct rutas {
   int codruta;
   char cadorigen[20];
   char caddestino[20];
   float distancia;
};
  typedef struct rutas trut;
 
 
void writeRuta();
void datos_ruta () ;
void imprimeRuta();
void imprimeRutas();
void leer_registro();
void selectOpcio();

int main(){
selectOpcio();
}

void selectOpcio(){
int opcio = 0;
while(opcio !=3){
printf("\nTeclee 1 para mostrar todos los registros ");
printf("\nTeclee 2 para agregar uno nuevo ");
printf("\nTeclee 3 para salir ");
printf("\nOpcio :");
scanf("%d",&opcio);
LIMPIA_BUFFER;
if(opcio == 1){
leer_registro();
}else if(opcio == 2){
datos_ruta();
}else if(opcio != 3){
printf("\nOpcion invalida !!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
}
}
}
int compara_cod(int cod_buscado){
FILE *pfich;
trut ruta;

pfich = fopen(NOMBRE_ARCHI, "ab+");

fread(&ruta,sizeof(trut),1,pfich);
while(!feof(pfich)){
if(cod_buscado == ruta.codruta){
return 1; //encontrado
}
fread(&ruta,sizeof(trut),1,pfich);
}
fclose(pfich);
return 0;
}


void leer_registro(){
FILE *pfich;
trut ruta;
int reg_leidos = 0;

pfich = fopen(NOMBRE_ARCHI, "ab+");

fread(&ruta,sizeof(trut),1,pfich);
while(!feof(pfich)){
imprimeRuta(ruta);
fread(&ruta,sizeof(trut),1,pfich);
reg_leidos++;
}
printf("\n\n Numero de registros leidos =%d \n\n",reg_leidos);
fclose(pfich);
}


void imprimeRutas(trut ruta[], int size){
int cont = 0;
for(cont ; cont < size ; cont++){
imprimeRuta(ruta[cont]);
}
}
void imprimeRuta(trut ruta){
printf("\n Cod:%d Origen:%s  Destino:%s  Distancia:%f",ruta.codruta, ruta.cadorigen , ruta.caddestino, ruta.distancia);
}
void writeRuta(){
trut rutas[2] ;
FILE *fichero ;
int cont = 0 ;

rutas[0].codruta = 10;
strcpy(rutas[0].cadorigen , "Barcelona");
strcpy(rutas[0].caddestino , "Madrid");
rutas[0].distancia = 500;

rutas[1].codruta = 20;
strcpy(rutas[1].cadorigen , "Murcia");
strcpy(rutas[1].caddestino , "Sevilla");
rutas[1].distancia = 200;

fichero = fopen(NOMBRE_ARCHI ,"ab+");

fwrite(rutas, sizeof(rutas[cont]), 2, fichero );
fclose(fichero);

}

 
void datos_ruta () {
    int cod = 0;
    int condicion=0;
    trut rutas;
    FILE *pfich;
   
  printf ("Introduzca el codigo de la ruta:");
  scanf ("%d",&cod);
  LIMPIA_BUFFER; // importantísimo limpiar el buffer después de leer
  pfich = fopen(NOMBRE_ARCHI,"ab+");
      if (pfich == NULL) {
        printf ("Se ha producido un error. Imposible abrir el fichero.");
        return ;
      }else{
          while (condicion == 0){    
             if (compara_cod(cod)) {   // en este punto llamamos a la rutina que compara los códigos             
                printf ("El codigo introducido ya existe.");
                printf ("Por favor, introduzca un codigo diferente:");
                scanf ("%d",&cod);
LIMPIA_BUFFER;
                //fseek(pfich,0,0);    // ya no tiene caso situarse al principio
                condicion=0;           
             } else  {               
                 printf ("INTRODUZCA:\n\n");
rutas.codruta = cod;   //te faltaba esto para que se informe el número de codigo
                 printf ("*Origen del viaje:");
                 scanf ("%s",&rutas.cadorigen);
LIMPIA_BUFFER;
                 printf ("*Destino del viaje:");
                 scanf ("%s",&rutas.caddestino);
LIMPIA_BUFFER;
                 printf ("*Distancia a recorrer:");
                 scanf ("%f",&rutas.distancia);
LIMPIA_BUFFER;
                 condicion=1;   
fwrite (&rutas, sizeof(rutas),1,pfich);
system ("cls");
printf ("*La ruta ha sido creada correctamente*");   
             }
          }          
getch ();
       }
  fclose(pfich);
}



#152
Estaría bien que postearas el código para ver que puede estar dando problemas  ::)
#153
Lo referido es al siguiente post

http://foro.elhacker.net/programacion_cc/progrmacion_en_c-t295555.0.html

Reglas del foro , supongo que a Eternal Idol se le han olvidado ..
Citar
I.A.2. Respuestas.
   I.A.2.b. Antítesis.
    En caso de que un usuario esté en desacuerdo con el contenido de un mensaje, este deberá expresar su opinión de forma respetuosa y
   respaldando sus comentarios, en caso de que el tema sea completamente erróneo se deberá explicar el porqué, en todo caso se debe asumir buena fe.   

    El autor original del mensaje debe responder de igual forma a los mensajes dentro del tema, las opiniones de otros usuarios deberá ser
   respetada aunque no sea compartida.
#154
Me gustaría poder entender lo que quieres hacer con el archivo , lo que tengo claro es que quieres cargarlo en memoria completo , podrias usar un array para almacenarlo y hacer con él lo que necesitas , te lo has planteado ?
#155
Programación C/C++ / Re: programacion en c
4 Junio 2010, 12:58 PM

Fíjate siempre en los mensajes que te da el compilador ...
Aquí te esta diciendo que tienes un error en la línea 8 , tienes una ñ metida en "año"  mejor intenta no usar eñes

lis.c:8: error: stray '\361' in program
lis.c:8: error: expected ':', ',', ';', '}' or '__attribute__' before 'o'


Este error es el más claro de todos , "\N" no es una secuencia válida de escape la correcta es "\n" , cambiala !

lis.c:27:9: warning: unknown escape sequence '\N'   // \N no es una secuencia de escape , prueba con \n
lis.c: In function 'DarAlta':


Esto esta relacionado con el error de la variable año de la estructura fecha

lis.c:46: error: 'struct fecha' has no member named 'a'
lis.c:46: error: stray '\361' in program
lis.c:46: error: expected ')' before 'o'
#156
Primero que nada te recomiendo que utilices la etiqueta geshi para poner tu codigo.

A simple vista parece ser que tu error está en el while , en ningún momento modificas x
ni tampoco la incializas , por consiguiente nunca será 0


while(x!=0) // nunca se cumple men
#157
Pues a simple vista diria que lo único que tienes que hacer es implementar un compara para los floats ejem.

int compara_deuda(struct registro *r1, struct registro *r2){
   return(r1->deuda >  r2->deuda ));
}


y pasarselo al qsort donde corresponda


qsort(punt_memoria,num_registros,sizeof(cliente),compara_deuda);


ya me diras si te funciona ...
Lo siguiente ordena por deuda de manera ascendente


/* Programa de ejemplo de gestió de memoria dinámica. El programa tomará
los registros de un fichero y reservará la memoria necesaria para poder
guardarlos en memoria y ordenarlos con el qsort(), una vez ordenados los
volverá a guardar en el fichero */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* macro para leer cadenas con caracteres blanco filtrando los return y
   blancos iniciales  */
#define lee_cad(cad,n,fin) cad[0]=getchar(); \
                           while(((int)cad[0] == 10) || ((int)cad[0] == 32)) \
                              cad[0]=getchar();\
                           n=0; \
                           while(((int)cad[n]!= 10) && (n < fin)){ \
               n++; cad[n]=getchar();} \
           cad[n]='\0';

struct registro{
   char nombre[50];
   float deuda;
};

/* Prototipos de procedimientos */
int compara_float();
int compara();


int main(){
  FILE * df;
  struct registro cliente;
  int i,fin;
  char op;
  int num_registros;
  struct registro *punt_memoria;


  if((df=fopen("apuestas.dat","wb")) == NULL){
     printf("\nError al crear el fichero apuestas.dat\n");
     exit(1);
  }


  do{
     printf("Nombre del apostante: ");
     lee_cad(cliente.nombre,i,50);
     //scanf("%49s",cliente.nombre);
     printf("Deuda? ");
     scanf("%f",&cliente.deuda);
     fwrite(&cliente,sizeof(cliente),1,df);
     printf("Otro(0 --> No / 1 --> Sí) ");
     scanf("%d",&fin);
  }
  while(fin!=0);

  fclose(df);

  if((df=fopen("apuestas.dat","rb")) == NULL){
     printf("\nError al abrir el fichero apuestas.dat\n");
     exit(1);
  }
  /* Para ver cuantos registros hay en el fichero, pongo el puntero
  al final, obtengo su posición y divido por el tamaño del registro */
  fseek(df,0,SEEK_END);

  num_registros = ftell(df)/sizeof(cliente);

  /* Reservo la memoria necesaria para estos registros */
  punt_memoria = (struct registro *)calloc(num_registros, sizeof(cliente));

  /* Leo los registro del fichero y los guardo en memoria */

  rewind(df); /* Llego el descriptor de fichero al principio */
  /* Leo todos los registros y los guardo en la zona reservada de memoria */
  fread(punt_memoria,sizeof(cliente),num_registros,df);

  fclose(df);
  /* Ordeno el vector con qsort() */

  qsort(punt_memoria,num_registros,sizeof(cliente),compara_float);  /* simplemante cambias el parámetro con el nuevo tipo de ordenación */

  /* Guarda los registros ordenados en el fichero */
  if((df=fopen("apuestas.dat","wb")) == NULL){
     printf("\nError al crear el fichero apuestas.dat\n");
     exit(1);
  }
  fwrite(punt_memoria,sizeof(cliente),num_registros,df);
  fclose(df);

  /* Mostrar el contenido del fichero ordenado */
  if((df=fopen("apuestas.dat","rb")) == NULL){
     printf("\nError al abrir el fichero apuestas.dat\n");
     exit(1);
  }
  fread(punt_memoria,sizeof(cliente),num_registros,df);
  for(i=0; i < num_registros; i++)
    printf("%s  %.1f\n",(punt_memoria+i)->nombre, (punt_memoria+i)->deuda);
  fclose(df);
  free(punt_memoria);
} /* main() */

/* La función compara usa strcmp para ordenar alfabéticamente
   el fichero */

int compara(struct registro *r1, struct registro *r2){
    return(strcmp(r1->nombre, r2->nombre));
}
int compara_float(struct registro *r1, struct registro *r2){
return(r1->deuda > r2->deuda);
}

#158
A mi me paso algo parecido , mirate esto
 http://foro.elhacker.net/programacion_cc/problemas_con_funcion_tolower_del_ctype-t279250.0.html;msg1374719#msg1374719

una posible solución es la siguiente:

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

int main() {
char listado[3][10];

strcpy(listado[0], "_:\\mi_listado.txt");
strcpy(listado[1], "_:\\notas.txt");
strcpy(listado[2], "_:\\p.txt") ;
 

int i;

for (i=0; i < 3; i++) {
     listado[i][0] = 'C';
     printf("%s\n",listado[i]);
}

getchar();

}


#159
No entiendo mucho de C++ pero en niguna de las funciones estas usando/modificando el valor de las variables que pasas como parametro a las mismas
por ejemplo en "calcular" no veo que utilices dentro de la función  ni "int *anguloprincipal" ,  ni    "int *aux",  ni  "int LIM" ......
#160
Programación C/C++ / Re: Librería
26 Mayo 2010, 09:17 AM
Pienso que sería buena idea incluir la implementación de TAD's (árboles , pilas , colas) que les parece ?