elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Escritura incorrecta de caracteres en manejo de archivos C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Escritura incorrecta de caracteres en manejo de archivos C++  (Leído 1,982 veces)
Abril7

Desconectado Desconectado

Mensajes: 22


Ver Perfil
Escritura incorrecta de caracteres en manejo de archivos C++
« en: 13 Septiembre 2017, 23:02 pm »

Hola! Tengo el problema de que al pasar una variable para su escritura en un archivo, se pasan otros caracteres en su lugar y no se por que, imprimo la variable antes de usarla y esta correcta pero ya en el archivo se añaden datos que no corresponden y no entiendo por que, ya prove casteando la variable y aun asi no se arregla, ya no se que mas puedo hacer, muchas gracias.

LA FUNCION CAPTURAR ES LA DEL PROBLEMA, justo abajo de la generacion del health number, en esa parte al escribir el archivo, gracias.

Código:
#ifndef PATIENT_H
#define PATIENT_H


class Patient
{
    public:
        void capture();
        void show();
        void deleteP();
        void searchP();
        void edit();

    private:
        char healthNumber[30];
        char name[30];
        char ailing[30];
        char treatment[30];
};

#endif // PATIENT_H

Código:
#include <iostream>
#include <fstream>
#include <string.h>
#include <string>
#include "Patient.h"
#include <cstring>
using namespace std;

int main(){
    int op;
    Patient patient;
    int z=1;
    cout<<"---------------------------------------PATIENT INFO----------------------------------------"<<endl;
    cout<<"PLEASE TYPE EVERYTHING WITH CAPITAL LETTERS, OTHERWISE YOU MAY HAVE PROBLEMS FINDING A FILE"<<endl<<endl;
    while(z!=0){
        cout<<"What do you want to do?"<<endl;
        cout<<"\t 1)Capture"<<endl;
        cout<<"\t 2)Show"<<endl;
        cout<<"\t 3)Search"<<endl;
        cout<<"\t 4)Delete"<<endl;
        cout<<"\t 5)Edit"<<endl;
        cin>>op;

            switch(op)
            {
                case 1:
                    patient.capture();
                    break;
                case 2:
                    patient.show();
                    break;
                case 3:
                    patient.searchP();
                    break;
                case 4:
                    patient.deleteP();
                    break;
                case 5:
                    patient.edit();
                    break;
                default:
                    cout<<"Your option was invalid, type a valid number."<<endl;
            }
    }
    return 0;
}

Código:
#include "Patient.h"
#include <iostream>
#include <string>
#include <string.h>
#include <fstream>
using namespace std;


void Patient::capture()
{
    int hN,n,a,t;
    cout<<"Name: ";
    cin.ignore();
    cin.getline(name,30);
    cout<<"Ailing: ";
    cin.getline(ailing,30);
    cout<<"Treatmeant: ";
    cin.getline(treatment,30);
    //--------------HEALTH NUMBER GENERATOR----------------
    char *ptr;
    ptr = strtok(name," ");
    string aux = ptr;
    string letter = aux.substr(0,1);
    string add = letter;
    cout<<"Health Number: ";
    while(ptr != NULL)
    {
        ptr = strtok(NULL, " ");
        if(ptr == NULL)break;
        string aux = ptr;
        letter = aux.substr(0,1);
        add = add + letter;
    }
    char *aux1 = new char[add.length() + 1];
    strcpy(aux1, add.c_str());
    delete [] aux1;
    //-----------------------------------------------------
    cout<<add<<endl;


    ofstream write;

    write.open("Patients.txt",ios::app);
        hN = strlen(aux1);
        n = strlen(name);
        a = strlen(ailing);
        t = strlen(treatment);

        write.write((char *)&hN,sizeof(hN));
        write.write((char *)&aux1,hN);
        write.write((char *)&n,sizeof(int));
        write.write((char *)&name,n);
        write.write((char *)&a,sizeof(int));
        write.write((char *)&ailing,a);
        write.write((char *)&t,sizeof(int));
        write.write((char *)&treatment,t);
        write.close();
}
void Patient::show()
{
    int hN,n,a,t;
    ifstream read;
    read.open("Patients.txt", ios::in);
    if (!read.good())
    {
        cout<<"\n\n\tFile not found."<<endl;
    }
    else
    {
        while(!read.eof()){
            read.read((char *)&hN,sizeof(int));
            read.read((char *)&healthNumber,hN);
            healthNumber[hN]='\0';
            read.read((char *)&n,sizeof(int));
            read.read((char *)&name,n);
            name[n]='\0';
            read.read((char *)&a,sizeof(int));
            read.read((char *)&ailing,a);
            ailing[a]='\0';
            read.read((char *)&t,sizeof(int));
            read.read((char *)&treatment,t);
            treatment[t]='\0';

            if(read.eof()){break;}
                cout<<endl;
                cout<<"___________________________________"<<endl;
                cout<<"Health Number: "<<healthNumber<<endl;
                cout<<"Name: "<<name<<endl;
                cout<<"Ailing: "<<ailing<<endl;
                cout<<"Treatment: "<<treatment<<endl;
                cout<<"___________________________________"<<endl;
        }read.close();
    }
}
void Patient::searchP()
{
    int hN,n,a,t;
    string id;
    ifstream read ("Patients.txt");
    bool found = false;

    cout<<"Type de health number [ID] that you want to find: ";
    cin>>id;


    if (!read.good())
    {
        cout<<"\n\n\tFile not found."<<endl;
    }
    else
    {
        while(!read.eof() && found == false){
            read.read((char *)&hN,sizeof(int));
            read.read((char *)&healthNumber,hN);
            healthNumber[hN]='\0';
            read.read((char *)&n,sizeof(int));
            read.read((char *)&name,n);
            name[n]='\0';
            read.read((char *)&a,sizeof(int));
            read.read((char *)&ailing,a);
            ailing[a]='\0';
            read.read((char *)&t,sizeof(int));
            read.read((char *)&treatment,t);
            treatment[t]='\0';

            if(healthNumber == id){
                cout<<"______________FOUND_______________"<<endl;
                cout<<"Health Number: "<<healthNumber<<endl;
                cout<<"Name: "<<name<<endl;
                cout<<"Ailing: "<<ailing<<endl;
                cout<<"Treatment: "<<treatment<<endl;
                cout<<"___________________________________"<<endl;
                found = true;
            }

            if(read.eof()){cout<<"/t Health number not found."<<endl; break;}

        }
        read.close();
    }
}
void Patient::deleteP()
{
    string word;
    cout<<"Type the idProfile that you want to find: "<<endl;
    cin>>word;

    int hN,n,a,t;
    ifstream read;
    read.open("User.txt",ios::in);
    ofstream aux;
    aux.open("temp.txt",ios::out);
    bool found = false;

    if (!read.good())
    {
        cout<<"\n\n\tFile not found."<<endl;
    }
    else
    {
        while(!read.eof()){
            found = false;

            hN = strlen(healthNumber);
            n = strlen(name);
            a = strlen(ailing);
            t = strlen(treatment);

            read.read((char *)&hN,sizeof(int));
            read.read((char *)&healthNumber,hN);
            healthNumber[hN]='\0';
            read.read((char *)&n,sizeof(int));
            read.read((char *)&name,n);
            name[n]='\0';
            read.read((char *)&a,sizeof(int));
            read.read((char *)&ailing,a);
            ailing[a]='\0';
            read.read((char *)&t,sizeof(int));
            read.read((char *)&ailing,t);
            treatment[t]='\0';

                if(word == name){
                    cout<<"______________DELETED_______________"<<endl;
                    cout<<"Health number: "<<healthNumber<<endl;
                    cout<<"Name: "<<name<<endl;
                    cout<<"Ailing: "<<ailing<<endl;
                    cout<<"Treatment: "<<treatment<<endl;
                    cout<<"___________________________________"<<endl;
                    found = true;
                }
                else if(found == false){
                    if(read.eof()){cout<<"File not found."<<endl; break;}

                    hN = strlen(healthNumber);
                    n = strlen(name);
                    a = strlen(ailing);
                    t = strlen(treatment);

                    aux.write((char *)&hN,sizeof(int));
                    aux.write((char *)&healthNumber,hN);
                    aux.write((char *)&n,sizeof(int));
                    aux.write((char *)&name,n);
                    aux.write((char *)&a,sizeof(int));
                    aux.write((char *)&ailing,a);
                    aux.write((char *)&t,sizeof(int));
                    aux.write((char *)&treatment,t);
                }


        }
        read.close();
        aux.close();
        remove("User.txt");
        rename("temp.txt","User.txt");
    }
}
void Patient::edit()
{
    string word;
    cout<<"Type the idProfile that you want to find: "<<endl;
    cin>>word;

    int hN,n,a,t;
    ifstream read;
    read.open("User.txt",ios::in);
    ofstream aux;
    aux.open("temp.txt",ios::out);
    bool found = false;

    if (!read.good())
    {
        cout<<"\n\n\tFile not found."<<endl;
    }
    else
    {
        while(!read.eof()){
            found = false;

            hN = strlen(healthNumber);
            n = strlen(name);
            a = strlen(ailing);
            t = strlen(treatment);

            read.read((char *)&hN,sizeof(int));
            read.read((char *)&healthNumber,hN);
            healthNumber[hN]='\0';
            read.read((char *)&n,sizeof(int));
            read.read((char *)&name,n);
            name[n]='\0';
            read.read((char *)&a,sizeof(int));
            read.read((char *)&ailing,a);
            ailing[a]='\0';
            read.read((char *)&t,sizeof(int));
            read.read((char *)&ailing,t);
            treatment[t]='\0';

                if(word == name){
                    cout<<"______________DELETED_______________"<<endl;
                    cout<<"Health number: "<<healthNumber<<endl;
                    cout<<"Name: "<<name<<endl;
                    cout<<"Ailing: "<<ailing<<endl;
                    cout<<"Treatment: "<<treatment<<endl;
                    cout<<"___________________________________"<<endl;
                    found = true;
                }
                else if(found == false){
                    if(read.eof()){cout<<"File not found."<<endl; break;}

                    hN = strlen(healthNumber);
                    n = strlen(name);
                    a = strlen(ailing);
                    t = strlen(treatment);

                    aux.write((char *)&hN,sizeof(int));
                    aux.write((char *)&healthNumber,hN);
                    aux.write((char *)&n,sizeof(int));
                    aux.write((char *)&name,n);
                    aux.write((char *)&a,sizeof(int));
                    aux.write((char *)&ailing,a);
                    aux.write((char *)&t,sizeof(int));
                    aux.write((char *)&treatment,t);
                }


        }
        read.close();
        aux.close();
        remove("User.txt");
        rename("temp.txt","User.txt");
    }
}


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Escritura incorrecta de caracteres en manejo de archivos C++
« Respuesta #1 en: 14 Septiembre 2017, 21:35 pm »

Código
  1. write.write((char *)&aux1,hN);
aux1 ya es un char*. Si pones "&aux1" estás consiguiendo la dirección de aux1, un char**.
Lo que te escribirá en el archivo será lo que guardaba aux1 (un puntero), binario, y el resto "basura".
write(aux1, hN) debería llegar. aux1 es un char*^, así que simplemente escríbelo.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
problema con escritura de archivos
Programación C/C++
drakolive 4 3,126 Último mensaje 2 Junio 2010, 22:03 pm
por Littlehorse
Ayuda por favor con manejo de cadenas de caracteres y numéricas
Programación C/C++
deschattenmann 7 3,709 Último mensaje 5 Julio 2010, 20:20 pm
por nicolas_cof
[utf-8] conflicto con manejo de caracteres !
PHP
Diabliyo 6 3,683 Último mensaje 18 Mayo 2011, 01:32 am
por bomba1990
Escritura con archivos JAVA
Java
rommel89 1 2,843 Último mensaje 19 Julio 2012, 07:05 am
por rommel89
[python] manejo de caracteres en un txt
Scripting
flony 2 2,517 Último mensaje 29 Marzo 2016, 18:33 pm
por flony
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines