Crear archivo de texto y cargarlo

Iniciado por sebamoron86, 23 Mayo 2016, 21:20 PM

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

sebamoron86

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

#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;
}



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

class_OpenGL

Para empezar, tendrías que decidir con qué estructura guardar la estructura. Por ejemplo, podría ser la siguiente:

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

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

sebamoron86

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

AlbertoBSD

#3
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

[youtube=640,360]https://www.youtube.com/watch?v=DOqtEMW1Nqk[/youtube]
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

sebamoron86

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?

AlbertoBSD

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!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

class_OpenGL

Una cosilla, si usas fwrite para guardar datos en binario (que es el caso), es mejor abrir el archivo como binario

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

AlbertoBSD

#7
Aaa si cierto cuando hice el video se me paso abrirlo como binario >>> "wb"

file = fopen("archivo.ext","wb");

Por luego si guardas ciertos valores tendrias problemas.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

sebamoron86

Gracias a todos por contestar!
Quise hacerlo para texto como el fprintf pero no se como funciona

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