Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: sebamoron86 en 23 Mayo 2016, 21:20 pm



Título: Crear archivo de texto y cargarlo
Publicado por: sebamoron86 en 23 Mayo 2016, 21:20 pm
Hola quiero crear un archivo y cargarlo a partir de una estructura.
Crear el archivo creo que lo hago bien pero el problema es que no se como se carga los datos

Código:
#include <stdio.h>
#include <stdlib.h>
#define Arct "D:\\Ejercicios\\ArchivoDeTexto"
#include "ArchivoDeTexto.h"


int main()
{
    int i;
    tpers persona[5];
    FILE *fpTex;
    fpTex=fopen("Arct.txt","wt");
    if(fpTex=NULL)
    {
        printf("error");
    }

for(i=0;i<5;i++)
{
    printf("Ingrese el DNI:");
    scanf("%ld",&persona[i].dni);
    printf("El apellido y nombre:");
    scanf("%s",persona[i].apyn);
    printf("Ingrese el sexo:");
    scanf("%s",persona[i].sex);
    printf("Ingrese la fecha:");
    scanf("%d/%d/%d",
                        &persona[i].fec.di,
                        &persona[i].fec.me,
                        &persona[i].fec.an);
    printf("Ingrese el impuesto:");
    scanf("%f",&persona[i].impuesto);
    printf("\n");
}

    return 0;
}

Código:
typedef struct
{
    int di,
        me,
        an;
}tfecha;

typedef struct
{
    long dni;
    char apyn[34];
    char sex[2];
    tfecha fec;
    float impuesto;
}tpers;

Creo que hay una funcion para esto pero no pude encontrar cual es.
Gracias por adelantado


Título: Re: Crear archivo de texto y cargarlo
Publicado por: class_OpenGL en 23 Mayo 2016, 21:37 pm
Para empezar, tendrías que decidir con qué estructura guardar la estructura. Por ejemplo, podría ser la siguiente:

Código:
3456566
Perez Alex
H
3/7/1995
54.0

6588678
Fernandez Pablo
H
7/12/1997
56.0

...

Para ello, solo tendrías que hacer fprintf(fpTex, /*fecha, nombre, y todo lo demás*/);

O podrías guardar la estructura tal y como viene representada en memoria.

Sabiendo que puedes representar la dirección a una estructura como cadena de caracteres (char *), sabiendo que existe la función fwrite, y sabiendo que para usar fwrite lo más recomendable es abrir el archivo en binario, puedes hacer la tarea con un par de funciones


Título: Re: Crear archivo de texto y cargarlo
Publicado por: sebamoron86 en 26 Mayo 2016, 16:32 pm
Hola, muchas gracias por contestar.
¿lo que vos me estas diciendo no es hardcodearlo?
No se si me explique bien pero lo que quiero es que el programa me pida los datos, que los cargue y yo despues abriendo el .txt los pueda ver
¿El fprintf tendria que ir adentro del for y hacerse cada vez que ingreso el lote de una persona, no?
Muchas gracias de nuevo


Título: Re: Crear archivo de texto y cargarlo
Publicado por: AlbertoBSD en 26 Mayo 2016, 16:39 pm
Puedes guardar la estructura completa o dato por dato

Como te dicen tienes que decidir como hacerlo si quieres guardar toda la memoria donde se almacena la estructura en formato binario o hacerlo dato por dato en texto plano.

Te dejo uno de mis vídeos donde muestro como hacerlo con fwrite

DOqtEMW1Nqk


Título: Re: Crear archivo de texto y cargarlo
Publicado por: sebamoron86 en 26 Mayo 2016, 17:44 pm
Hola, gracias por contestar!
Tu video es genial me aclaro muchas dudas solo me quedaron dos: en el video el archivo es .db y en el modo le pusiste solo w sino me acuerdo mal asi se crea un archivo en formato texto ¿por que en vez de .db no pusiste .txt y lo abrias con un editor de texto?
Y la segunda ¿si yo lo quiero almacenar en texto plano cada vez que ingrese un lote de datos de una persona se va al archivo y se graba por cada persona y en el binario me permite ingresar diez lotes y se guarda solamente al final una sola vez?


Título: Re: Crear archivo de texto y cargarlo
Publicado por: AlbertoBSD en 26 Mayo 2016, 17:50 pm
La extensión del archivo es independiente de lo que le guardes  :silbar: :silbar: :silbar:

Me refiero puede ser un archivo TXT pero puede tener datos binaros, Lo ideal es que txt sea texto plano y nada de binario pero de poder se puede...

Ahora Sobre lo de guardar registros de uno en uno o todos al final es tu eleccion mientras lo hagas correctamente.

Por ejemplo abres el archivo antes del for o while y posteriormente dentro del ciclo agregas registros de uno en uno al archivo despues de capturarlos desde el teclado.

O puedes escribirlos al final Es independiente... y lo repito es tu eleccion como mejor se te acomode.

Lo unico que cambiaria es el numero de elementos a escribir en el fwrite.  y para leerlo necesitas fread El cual es para formato Binario.....

Si queires que se vea en texto plano tienes que usar fprintf y los formatos de cadena adecuados para cada tipo de dato y posteriormente para leer el archivo necesitas fscanf.

Saludos!


Título: Re: Crear archivo de texto y cargarlo
Publicado por: class_OpenGL en 26 Mayo 2016, 18:30 pm
Una cosilla, si usas fwrite para guardar datos en binario (que es el caso), es mejor abrir el archivo como binario


Título: Re: Crear archivo de texto y cargarlo
Publicado por: AlbertoBSD en 26 Mayo 2016, 22:07 pm
Aaa si cierto cuando hice el video se me paso abrirlo como binario >>> "wb"

Código
  1. file = fopen("archivo.ext","wb");

Por luego si guardas ciertos valores tendrias problemas.

Saludos


Título: Re: Crear archivo de texto y cargarlo
Publicado por: sebamoron86 en 27 Mayo 2016, 18:50 pm
Gracias a todos por contestar!
Quise hacerlo para texto como el fprintf pero no se como funciona
Código:
int main()
{
    int i;
    tpers persona[2];
    FILE *fpTex;
for(i=0;i<2;i++)
{
    printf("Ingrese el DNI:");
    scanf("%ld",&persona[i].dni);
    printf("El apellido y nombre :");
    fgets(persona[i].apyn,34,stdin);
    printf("Ingrese el sexo:");
    fgets(persona[i].sex,2,stdin);
    printf("Ingrese la fecha:");
    scanf("%d/%d/%d",
                        &persona[i].fec.di,
                        &persona[i].fec.me,
                        &persona[i].fec.an);
    printf("Ingrese el impuesto:");
    scanf("%f",&persona[i].impuesto);
    printf("\n");
}
fpTex=fopen("Arct.txt","wt");
if(fpTex)
{
/*fwrite(persona,sizeof(tpers),3,fpTex); si fuera binario*/
fprintf(fpTex,"%ld%s%s%d%d%d%f",persona.dni,persona.apyn,persona.sex,persona.fec.di,persona.fec.me,persona.fec.an,persona.impuesto);
fclose(fpTex);
}
    return 0;
}

Y otra cosa no se porque no me funciona el fgets de apellido nombre