Foros del Web » Programación para mayores de 30 ;) » C/C++ »

gets no recoge caracteres

Estas en el tema de gets no recoge caracteres en el foro de C/C++ en Foros del Web. Tengo una función que pide introducir un titulo y el autor de un libro, para ello he creado la siguiente estructura: Código: struct libros{ char ...
  #1 (permalink)  
Antiguo 08/03/2009, 17:17
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Pregunta gets no recoge caracteres

Tengo una función que pide introducir un titulo y el autor de un libro, para ello he creado la siguiente estructura:
Código:
struct libros{
    char titulo[20];
    char autor[20];
}libros[10];
int i;
Entonces en la función quiero añadir nuevas entradas a el array etructura.
Código:
void intro(){
    char a;
    int mas=1;
    printf("Deseas introducir algun libro ?(s/n): ");
    scanf("%c",&a);
    if(a=='s' || a=='S'){
        while(mas!=0){
            printf("\n");
            printf("Introduzca el titulo: ");
            gets(libros[i+1].titulo);
            printf("Introduzca el autor: ");
            gets(libros[i+1].autor);
            printf("Desea introducir mas libros ?(1-si,2-no) ");
            scanf("%d",&mas);
            }
        }
}
Uso i para definir la posicion en la qual voy a introducir los datos, ya que anteriormente he introducido datos procedentes de un fichero.

El problema es que hace como si el primer gets no estuviese, i en canvio el otro si que funciona, y la verdad es que no tengo ni idea de porque pasa esto...
  #2 (permalink)  
Antiguo 09/03/2009, 05:22
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: gets no recoge caracteres

scanf no saca el fin de linea, con getchar despues de scanf deberia funcionar ... fijate que la condicion del bucle no concuerda con las opciones que das (1-si, 2-no).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 09/03/2009, 12:58
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: gets no recoge caracteres

He hecho las modificaciones que me comentas, y ahora espera a que introduzca los datos correctamente, pero me he encontrado que por alguna razón los datos no se recogen bien, y las variables de la estructura aparecen vacios, copio el ódigo entero por si el error está en algún otra parte.

Código:
#include <stdio.h>
#include <string.h>
#include <windows.h>

//Declaracion de prototipo
void recoge_datos(void);
void error(int e);
void intro(void);
void vuelca_datos(void);

//Variables globales
FILE* origen;
struct usuarios{
    char usuario[20];
    char contra[20];
}usuarios[10];
 int i=0;

int main(){
    char conf=0;
    origen=fopen("data.db","r");
    if(!origen)error(1);
    while(!feof(origen)){
        conf=fgetc(origen);
        if(conf=='-'){
            fgetc(origen);
            recoge_datos();
            i++;
            }
        }
    intro();
    vuelca_datos();
    if(fclose(origen))error(2);
}

void recoge_datos(void){
    int x=0;
    fgets(usuarios[i].usuario,20,origen);
    puts(usuarios[i].usuario);
    fgets(usuarios[i].contra,20,origen);
    puts(usuarios[i].contra);
}

void error(int e){
    switch(e){
        case 1:printf("Error abriendo el archivo 'data.db'\n");break;
        case 2:printf("Error cerrando el archivo 'data.db'\n");break;
        case 3:printf("Error abriendo el archivo 'salida.db'\n");break;
        case 4:printf("Error cerrando el archivo 'salida.db'\n");break;
    }
}

void intro(){
    char a;
    int mas=1;
    printf("Deseas introducir algun usuario mas ?(s/n): ");
    scanf("%c",&a);
    getchar();
    if(a=='s' || a=='S'){
        while(mas==1){
            i++;
            printf("\n");
            printf("Introduzca el nombre de usuario: ");
            gets(usuarios[i].usuario);
            printf("Introduzca el nombre de autor: ");
            gets(usuarios[i].contra);
            printf("\nDesea introducir mas usuarios?(0-no,1-si) ");
            scanf("%d",&mas);
            getchar();
            }
        }
}

void vuelca_datos(){
    int cont;
    FILE* destino;
    destino=fopen("salida.db","w");
    if(!destino)error(3);
    for(cont=0; cont<i; cont++){
        fputc('-',destino);
        fputc('\n',destino);
        fputs(usuarios[cont].usuario,destino);
        fputs(usuarios[cont].contra,destino);
        puts(usuarios[cont].usuario);
        puts(usuarios[cont].contra);
        printf("\n%d\n\n",cont);
    }
    if(fclose(destino))error(4);
}
  #4 (permalink)  
Antiguo 09/03/2009, 16:30
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: gets no recoge caracteres

En el bucle de intro haces i++ al principio con lo cual usuarios[0] quedara vacio y ese es el indice al que accedes (logicamente) en vuelca_datos, asi que incrementa i despues del ultimo getchar.

PD. No podes usar fputs ya que se basa en el tamaño de la cadena y vos tenes que guardar datos de tamaño fijo (20 caracteres). Cuando llamas a error en main la ejecucion continua y llamas a feof con origen que es un valor invalido.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 10/03/2009, 13:44
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: gets no recoge caracteres

Podrias explicar mejor por que no se puede usar fputs ? no acabo de entender el porqué.

Última edición por neandertal; 10/03/2009 a las 13:51
  #6 (permalink)  
Antiguo 10/03/2009, 14:11
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: gets no recoge caracteres

Por ejemplo, si usuario es pedro y autor es sanchez tu archivo tendra esto: pedrosanchez. ¿Despues como sabes donde termina una cadena y empieza la otra? Supongo que para eso usas una cadena de tamaño fijo (20 caracteres), entonces fputs la vuelve inutil.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 11/03/2009, 12:41
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: gets no recoge caracteres

Pero fputs imprime en el archivo el retorno de linea, i cada usuario queda en una linea diferente, arreglé lo del i++ y lo puse después de getchar, y me di cuenta de que cuando recojo los datos del archivo se copia también el retorno de linea , ya está arreglado, supongo que era por lo del i++.
una pregunta, si tengo datos por ejemplo en usuarios[0], usuarios[1] lo tengo vacio y tengo datos en usuarios[2], strlen() me devolveria 3 o 1 ?
  #8 (permalink)  
Antiguo 11/03/2009, 13:39
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: gets no recoge caracteres

1, strlen busca el primer 0.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 11/03/2009, 13:56
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: gets no recoge caracteres

Ok, entonces sí que era por el i++, gracias por la ayuda
  #10 (permalink)  
Antiguo 11/03/2009, 14:41
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: gets no recoge caracteres

Espera; ¿Estas haciendo strlen sobre usuarios o usuario? Si es sobre lo primero esta mal tu logica (en realidad lo estas haciendo sobre usuarios[x].usuario).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #11 (permalink)  
Antiguo 11/03/2009, 14:51
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: gets no recoge caracteres

No,no, lo estoy haciendo sobre usuario
  #12 (permalink)  
Antiguo 11/03/2009, 15:28
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: gets no recoge caracteres

Bien entonces, eso entendi en su momento pero releyendo vi que en realidad decia usuarios
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:03.