Funcion importar de txt

Iniciado por kuni2006, 5 Agosto 2016, 20:46 PM

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

kuni2006

Estoy trabanjo en una funcion que me permita pasar registro de un txt al archivo binario que utiliza mi programa, esto es lo que se me ocurrio hasta ahora pero no parece funcionar, si alguien me pudiera dar una mano, lo apreciaria mucho.

void importar(char* nombreArchivo)
{
    Persona persona;
    FILE* file= fopen("nombres.txt", "rt");
    FILE* file1= fopen(nombreArchivo, "wb");

    while (EOF != fscanf(file, " %u %u %s %[^\n]s", persona.DNI, persona.fnac, persona.apellido, persona.nombres))
    {
        fprintf(file1," %d %d %s %[^\n]s ", persona.DNI, persona.fnac, persona.apellido, persona.nombres);

    }
    fclose;
}

AlbertoBSD

#1
Lo que estas haciendo es pasarlo de un Txt a otro txt.

La funcion deberia de ser fwrite:

fwrite(&persona,sizeof(Persona),1,file1);

O que es lo que no te funciona exactamente ?

Lo Guarda mal?
No escribe nada?
Escribe todos los registros menis el ultimo?
Escribe Basura?


Otra cosa deberia de ser:

while(!foef(file)){
// Hacer...
}

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Yoel Alejandro

Hola kuni2006,

Bueno, hay algunos detalles para que pueda funcionar correctamente. Al parecer tratas de leer el fichero de texto y almacenar dichos datos en un fichero binario (tal vez para gestionar una sencilla Base o Estructura de Datos).

En cuanto a fscanf(), no se si has leído el tema pero esta función recibe como argumento APUNTADORES a las variables donde debe escribirse la infromación:
Código (cpp) [Seleccionar]

fscanf(file, "%u %s %s %[^\n]s", &persona.DNI, &persona.fnac, &persona.apellido, &persona.nombres)


y nota que hempos usando el "&" para definir un apuntador al registro persona. Otro detalle, si vas a trabajar con ficheros binarios no se puede escribir con fprintf() (lo cual sería para escritura con formato sobre ficheros de texto) sino con fwrite(), tal como te dijo Alberto. En este caso se requiere como auxiliar las funciones ftell(), fseek() por lo que deberías leer un poco el tema para terminar de comprender (o pregunta por aquí). Esto en caso que usemos "C crudo", pues en C++ hay algunas clases definidas para ello que quizá hagan la tarea menos ruda (aunque yo me llevo muy bien con C crudo).

Otro detalle sería que inmediatamente luego de abrir los ficheros, es bueno cerciorarse que la operación se realizó exitosamente (open() devuelve un puntero no nulo), y en caso contrario salir del programa:
Código (cpp) [Seleccionar]

if ( ( file = fopen("nombres.txt", "rt") ) == NULL ) {
     printf( "Error al abrir fichero \"nombres.txt\"\n" );
     return;
}


En nuestro caso, diseñé el programa para que, con propósitos demostrativos, luego escribir en el fichero binario también lo podamos leer a fin de inspeccionar el resultado. Por eso le cambié el modo de apertura como lo tenías "wb" a "r+b".

Aquí el código fuente:
Código (cpp) [Seleccionar]

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

struct persona {
unsigned int DNI;
char fnac[21];
char apellido[51];
char nombres[51];
};
typedef struct persona Persona;

void importar(char* nombreArchivo);

int main( ) {

char *nombreArchivo = "datos.dat";

importar( nombreArchivo );

return 0;
}

void importar(char* nombreArchivo)
{
    Persona persona;
    FILE* file;
    FILE* file1;
int count;
int N_datos;

if ( ( file = fopen("nombres.txt", "rt") ) == NULL ) {
printf( "Error al abrir fichero \"nombres.txt\"\n" );
return;
}
if ( ( file1 = fopen(nombreArchivo, "r+b") ) == NULL ) {
printf( "Error al abrir fichero \"nombres.txt\"\n" );
return;
}

    printf( "\nEscribiendo en fichero binario:\n" );
count = 0;
    while (EOF != fscanf(file, "%u %s %s %[^\n]s", &persona.DNI, &persona.fnac, &persona.apellido, &persona.nombres))
    {
        /* === Escribiendo en el fichero binario === */
        fseek( file1, count * sizeof(Persona), SEEK_SET );
        fwrite( &persona, sizeof(Persona), 1, file1 );
        printf( "Dato %d:\n", count + 1 );
    printf( "  DNI: %u\n", persona.DNI );
    printf( "  DNI: %s\n", persona.fnac );
    printf( "  DNI: %s\n", persona.apellido );
    printf( "  DNI: %s\n", persona.nombres );
    printf( "========================================\n" );
       
        count++; /* actualizar contador */
    }
    fclose( file ); /* cerrar fichero de texto */
   
    /* === Ahora verificando los datos === */
    fseek( file1, 0, SEEK_END );
    N_datos = (int) (ftell( file1 ) / sizeof(Persona));
   
    printf( "\nLeyendo del fichero binario:\n" );
fseek( file1, 0, SEEK_SET ); /* posicionando al principio del fichero */
    for ( count = 0; count < N_datos; count++ ) {
        fread( &persona, sizeof(Persona), 1, file1 );
    printf( "Dato %d:\n", count + 1 );
    printf( "  DNI: %u\n", persona.DNI );
    printf( "  DNI: %s\n", persona.fnac );
    printf( "  DNI: %s\n", persona.apellido );
    printf( "  DNI: %s\n", persona.nombres );
    printf( "========================================\n" );
    }
   
    fclose( file1 ); /* cerrar fichero binario */
}


y suponiendo que en "nombres.txt" tengamos el siguiente contenido

12345 01/02/1980 Perez Jose Maria
85749 05/07/1978 Ramirez Ana Patricia
85711 21/07/1991 Fernandez Juan Manuel


el resultado sería:

Escribiendo en fichero binario:
Dato 1:
  DNI: 12345
  DNI: 01/02/1980
  DNI: Perez
  DNI: Jose Maria
========================================
Dato 2:
  DNI: 85749
  DNI: 05/07/1978
  DNI: Ramirez
  DNI: Ana Patricia
========================================
Dato 3:
  DNI: 85711
  DNI: 21/07/1991
  DNI: Fernandez
  DNI: Juan Manuel
========================================

Leyendo del fichero binario:
Dato 1:
  DNI: 12345
  DNI: 01/02/1980
  DNI: Perez
  DNI: Jose Maria
========================================
Dato 2:
  DNI: 85749
  DNI: 05/07/1978
  DNI: Ramirez
  DNI: Ana Patricia
========================================
Dato 3:
  DNI: 85711
  DNI: 21/07/1991
  DNI: Fernandez
  DNI: Juan Manuel
========================================


Un saludo, y cualquier cosa pregunta por aquí.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

kuni2006

Muchas gracias, tu codigo me ayudo a enteder mis errores y pude arreglar mi programa.

kuni2006

Otro problema que tengo es que cuando quiero que escriba lo del binario a un archivo me imprime en leguage de maquina, por que podra ser?

AlbertoBSD

Como estas hacianedo eso??

Si pones tu codigo podremos ayudarte mejor.  :¬¬

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Yoel Alejandro

Kuni, es obvio, los datos en binario se guardan como su nombre lo dice: en código binario.
La forma de leerlos es por medio de un apuntador a la variable donde serán copiados los datos, en nuestro ejemplo un apuntador a la variable persona, que es un tipo struct definido por el usuario. Luego, puedes enviar el valor de cada campo de dicho struct formateado a un fichero de texto, usando fprintf().

De hecho, si miras bien es justamente lo que hace la segunda parte del programa que de ti de muestra, sólo que usando printf() en lugar de fprintf() pues estamos escribiendo en la terminal en vez de un fichero. Para escribir en un fichero de texto usa  fprintf().
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

kuni2006

No fue nada, me confundí en una boludez que no veía y me estaba poniendo nervioso, gracias igual.