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:
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:
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:
#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í.