guarda caracteres raros en fichero

Dudas sobre el C/C++ en general
Responder
Mensaje
Autor
jirokygen
Mensajes: 1
Registrado: 06/03/2019 12:41 pm

guarda caracteres raros en fichero

#1 Mensaje por jirokygen » 06/03/2019 12:48 pm

Hola, soy algo nuevo en c y en un programa que estoy haciendo al guardar la estructura en vez de guardar los numeros me guarda caracteres raros.
una solucion que encontre fue asignarle el valor ascii directamente pero me gustaria saber si hay otra forma de hacerlo

Código: Seleccionar todo

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

using namespace std;
int n;
struct Evento{
    char cod[7];
    char n[51];
    char f[6];
    char ho[6];
    short int cat;
    int cod_lug;
}*e;
void Crear(){
    int cod,k=0;
    char cat[3];
    char re[7];
    char codc[6];
    srand(time(NULL));
    FILE *Ev=fopen("Eventos.bin", "a+b");
    if (Ev == NULL) {
        cout << "No se pudo abrir el archivo";
        exit(1);
    }


    e = (struct Evento *) malloc(sizeof (struct Evento));
    printf("Ingrese el nombre del evento\n");
    fflush(stdin);
    scanf("%s", e->n);

    printf("Ingrese la hora del evento ej.(18:30)\n");
    fflush(stdin);
    scanf("%s", e->ho);

    printf("Ingrese la fecha del evento ej.(26/01)\n");
    fflush(stdin);
    scanf("%s", e->f);
    printf("Igrese la categoria\n");
    printf("1.-Musica\n2.-Teatro\n3.-Deportes\n4.-Conferencias\n5.-Politico\n6.-Entretenimiento\n7.-Tecnologia\n");
    fflush(stdin);
    scanf("%d",&k);
    if (k<1||k>7){
        printf("lee bien estupido");
        exit(1);
    }
    e->cod_lug = '11'; //hasta que haya codigo de lugar
    switch (k){
        case 1:
            strcpy(cat,"MU");
            k=49;
            break;
        case 2:
            strcpy(cat,"TA");
           // k=50;
            break;
        case 3:
            strcpy(cat,"SP");
           // k=51;
            break;
        case 4:
            strcpy(cat,"CO");
           // k=52;
            break;
        case 5:
            strcpy(cat,"PL");
            //k=53;
            break;
        case 6:
            strcpy(cat,"EN");
            //k=54;
            break;
        case 7:
            strcpy(cat,"TC");
            //k=55;
            break;
        default:
            printf("error");
            break;
    }
    e->cat = k;
    cod=rand() % 9001;
    itoa(cod,codc,10);
    strcat(re,cat);
    strcat(re,codc);
    strcpy(e->cod,re);
    fwrite(e, sizeof (Evento), 1, Ev);
    fprintf(Ev,"\n");
    fclose(Ev);
}
void Leer(){
    int car;
    FILE *Ev=fopen("Eventos.bin","rb");
    if(Ev==NULL){
        cout<<"No se pudo abrir el archivo"<<endl;
        exit(1);
    }
    while ((car=fgetc(Ev))!=EOF){
        printf("%c",car);
    }
    fclose(Ev);
}
int main()
{
    cout<<"Elige una opcion: "<<endl;
    cout<<"1.- Crear Evento ."<<endl;
    cout<<"2.- leer todos los Eventos ."<<endl;
    cout<<"3.- Salir."<<endl;
    cin>>n;
    switch(n){
        case 1: Crear();
        break;
        case 2:Leer();
        break;
        case 3: cout<<"Adios :^)";
        break;
        default: cout<<"Opcion Invalida"<<endl;
        system("pause");
        int main();
        break;
    }
    return 0;
}

mollok
Mensajes: 439
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: guarda caracteres raros en fichero

#2 Mensaje por mollok » 06/03/2019 2:08 pm

Si guardas un dato numérico en un archivo binario no podrás verlo recuperándolo en forma de texto. Deberás cargarlo en forma binaria.
Cuando vayas a guardar una estructura no lo hagas de golpe, ve dándole al archivo la estructura miembro a miembro. Para recuperarla debes darle a la estructura los datos del archivo en el mismo orden. Entre comillas simples sólo puede haber un carácter.

He pasado todo a C ya que mezclabas conceptos con C++.

Tu programa corregido quedaría así:ç

Código: Seleccionar todo

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

struct Evento{
    char cod[7];
    char n[51];
    char f[6];
    char ho[6];
    short int cat;
    int cod_lug;
} e;

void Crear() {
    int cod, k;
    char cat[3];
    char re[7];
    char codc[7];

    FILE *Ev=fopen("Eventos.bin", "a+b");

    if(!Ev) {
        puts("No se pudo abrir el archivo");
        exit(1);
    }

    srand(time(NULL));

    puts("Ingrese el nombre del evento");
    scanf("%s", e.n);
    while(getchar()!='\n');

    puts("Ingrese la hora del evento ej.(18:30)");
    scanf("%s", e.ho);
    while(getchar()!='\n');

    puts("Ingrese la fecha del evento ej.(26/01)");
    scanf("%s", e.f);
    while(getchar()!='\n');

    puts("Igrese la categoria");
    puts("1.-Musica\n2.-Teatro\n3.-Deportes\n4.-Conferencias\n5.-Politico\n6.-Entretenimiento\n7.-Tecnologia");
    scanf("%d", &k);
    while(getchar()!='\n');
    if (k<1||k>7){
        printf("lee bien estupido");
        fclose(Ev);
        exit(1);
    }

    switch(k){
        case 1:
            strcpy(cat, "MU");
            k=49;
            break;
        case 2:
            strcpy(cat, "TA");
           // k=50;
            break;
        case 3:
            strcpy(cat, "SP");
           // k=51;
            break;
        case 4:
            strcpy(cat, "CO");
           // k=52;
            break;
        case 5:
            strcpy(cat, "PL");
            //k=53;
            break;
        case 6:
            strcpy(cat, "EN");
            //k=54;
            break;
        case 7:
            strcpy(cat, "TC");
            //k=55;
            break;
        default:
            printf("error");
            break;
    }
    e.cat = k;

    cod=rand() % 9001;
    itoa(cod, codc, 10);
    strcat(re, cat);
    strcat(re, codc);
    strcpy(e.cod, re);

    e.cod_lug = 11;

    fwrite(e.cod, sizeof(e.cod), 1, Ev);
    fwrite(e.n, sizeof(e.n), 1, Ev);
    fwrite(e.f, sizeof(e.f), 1, Ev);
    fwrite(e.ho, sizeof(e.ho), 1, Ev);
    fwrite(&e.cat, sizeof(e.cat), 1, Ev);
    fwrite(&e.cod_lug, sizeof(e.cod_lug), 1, Ev);
    fclose(Ev);
}

void Leer(){
    int car;
    FILE *Ev=fopen("Eventos.bin", "rb");
    if(!Ev){
        puts("No se pudo abrir el archivo");
        exit(1);
    }

    car=fgetc(Ev);
    while(!feof(Ev)){
        ungetc(car, Ev);
        fread(e.cod, sizeof(e.cod), 1, Ev);
        fread(e.n, sizeof(e.n), 1, Ev);
        fread(e.f, sizeof(e.f), 1, Ev);
        fread(e.ho, sizeof(e.ho), 1, Ev);
        fread(&e.cat, sizeof(e.cat), 1, Ev);
        fread(&e.cod_lug, sizeof(e.cod_lug), 1, Ev);

        printf("%s\n", e.cod);
        printf("%s\n", e.n);
        printf("%s\n", e.f);
        printf("%s\n", e.ho);
        printf("%d\n", e.cat);
        printf("%d\n", e.cod_lug);
        car=fgetc(Ev);
    }

    fclose(Ev);
}

int main() {
    int n;

    puts("Elige una opcion: ");
    puts("1.- Crear Evento.");
    puts("2.- Leer todos los Eventos.");
    puts("3.- Salir.");
    scanf("%d", &n);
    while(getchar()!='\n');

    switch(n) {
    case 1:
        Crear();
        break;
    case 2:
        Leer();
        break;
    case 3:
        puts("Adios :^)");
        break;
    default:
        puts("Opcion Invalida");
        system("pause");
        break;
    }
}
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados