Problemas con buffer, normal?

Iniciado por n-utz, 6 Abril 2017, 00:12 AM

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

n-utz

Buenas noches gente, miren estoy programando con el IDE Code:blocks en Ubuntu, y ultimamente me encontre con problemas no normales, donde supongo que el codigo esta bien e igual el programa se comporta extrañamente.

Generalmente se da cuando cargo un string y luego quiero imprimirlo, no lo imprime, o imprime uno solo y no los otros tres. Realice un codigo simple para que vean de que se trata:


typedef struct {
    char detalle[300];
    char sentencia[20];
    }funciones;

int main()
{
    funciones f;
    FILE* fichero;
    fichero = fopen("stdio_h.txt", "w");
    printf("escribi\n");
    scanf("%[^\n]", &f.detalle);
    scanf("% [^\n]", &f.sentencia);
    fwrite(&f, sizeof(funciones), 1, fichero);
    fclose(fichero);

    system("clear");
    fichero = fopen("stdio_h.txt", "r");
    fread(&f, sizeof(funciones), 1, fichero);
    printf("%s", f.detalle);
    printf("%s", f.sentencia);
    fclose(fichero);
    return 0;
}


Por ejemplo este codigo solo imprime lo que guarde en f.detalle, y lo de f.sentencia no lo imprime y finaliza el programa en consola.

Yo supongo que es un problema con el buffer, pero al estar en Ubuntu no puedo hacer uso de fflush(stdin);

Puede que limpie el buffer manualmente con este codigo:

void limpiar_buffer(){

    int c;
    do {
        c = getchar;
        }while (c != '\n' && c != EOF);

    return;}*/

/*void cargar_funcion();
char selec_libreria();
void ver_funciones();


Pero igual el programa falla, es mas parece que nunca sale de esa funcion/bucle, aunque el codigo lo saque de google.

Espero que puedan ayudarme, ya que necesito hacer un programa en C con archivos y demas.

Tambien acepto sugerencias de otros IDES.

MAFUS

A parte de un error en los scanf (para capturar cadenas no hay que usar el operador &) vacía el buffer con la sentencia

while(getchar()!='\n');

n-utz

Corregi esos errores, e igual me sigue imprimiendo la primer cadena sola, te comento como quedo el codigo:


void limpiar_buffer(){
    while(getchar()!='\n');

    return;}

/*void cargar_funcion();
char selec_libreria();
void ver_funciones();*/

int main()
{
    funciones f;
    FILE* fichero;
    fichero = fopen("stdio_h.txt", "w");
    printf("escribi\n");
    scanf("%[^\n]", f.detalle);
    limpiar_buffer();
    scanf("% [^\n]", f.sentencia);
    fwrite(&f, sizeof(funciones), 1, fichero);
    fclose(fichero);

    system("clear");
    fichero = fopen("stdio_h.txt", "r");
    fread(&f, sizeof(funciones), 1, fichero);
    printf("%s", f.detalle);
    limpiar_buffer();
    printf("%s", f.sentencia);
    fclose(fichero);
    //printf("\n %s", &fun.sentencia);
    return 0;
}

MAFUS

El segundo limpiar_buffer() sobra. No hay necesidad de limpiarlo allí.
De todas formas lo he probado y funciona. Muestra el contenido de las dos cadenas pero lo hace en la misma línea porqué no has usado un salto de linea cuando termina de escribir la primera.

n-utz

Simplemente era para probar, y no puedo hacer que funcione en mi IDE, imprime solo la primer cadena...

Alguien sabe de que se puede tratar??