Sábado 9 de Noviembre de 2024, 03:35
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
archivos
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: archivos (Leído 1521 veces)
faio
Nuevo Miembro
Mensajes: 5
archivos
«
en:
Miércoles 2 de Junio de 2010, 19:29 »
0
me falta la parte de archivos que no funciona, hace tiempo que no programo en c y olvide algunas cosas
Código: C
typedef
struct
nodoagenda
{
int
dni
;
char
nombre
[
15
]
;
char
apellidos
[
25
]
;
char
direccion
[
30
]
;
struct
nodoagenda
*
ant
;
struct
nodoagenda
*
sig
;
}
nodoagenda
;
void
CrearAgenda
(
nodoagenda
*
(
&
)
)
;
int
AgendaVacia
(
nodoagenda
*
)
;
int
AgendaLlena
(
nodoagenda
*
)
;
int
EstaElementoAgenda
(
nodoagenda
*,
int
)
;
void
InsertarAgenda
(
nodoagenda
*
(
&
)
)
;
void
EliminarElementoAgenda
(
nodoagenda
*
(
&
)
)
;
void
MostrarInversoAgenda
(
nodoagenda
*
)
;
void
BorrarAgenda
(
nodoagenda
*
(
&
)
)
;
void
GuardarAgenda
(
nodoagenda
*
)
;
void
LeerAgenda
(
nodoagenda
*
listad
)
;
//
void
CrearAgenda
(
nodoagenda
*
(
&
listad
)
)
{
listad
=
NULL
;
}
/*****************************************************************************************/
int
AgendaVacia
(
nodoagenda
*
listad
)
{
int
dev
=
0
;
if
(
listad
==
NULL
)
dev
=
-
1
;
return
dev
;
}
/*****************************************************************************************/
// Controlaremos la memoria en la insercion de elementos en la lista
int
AgendaLlena
(
nodoagenda
*
)
{
return
0
;
}
/*****************************************************************************************/
// Devuelve -1 si el elemento esta en la lista. 0 en caso contrario
int
EstaElementoAgenda
(
nodoagenda
*
listad
,
int
dni
)
{
nodoagenda
*
Paux
;
int
res
;
Paux
=
listad
;
while
(
(
Paux
!=
NULL
)
&&
(
Paux
->
dni
!=
dni
)
)
Paux
=
Paux
->
sig
;
if
(
Paux
==
NULL
)
res
=
0
;
else
res
=
-
1
;
return
res
;
}
/*****************************************************************************************/
void
InsertarAgenda
(
nodoagenda
*
(
&
listad
)
)
{
nodoagenda
*
Nuevonodo
,
*
Paux
;
int
dni
;
char
nombre
[
15
]
,
apellidos
[
25
]
;
Nuevonodo
=
(
nodoagenda
*
)
malloc
(
sizeof
(
nodoagenda
)
)
;
if
(
Nuevonodo
==
NULL
)
printf
(
"nSe produjo un error en la creación del elemento."
)
;
else
{
do
{
printf
(
"Introduce el dni: "
)
;
scanf
(
"%d"
,&
dni
)
;
}
while
(
(
dni
<
1
)
||
(
EstaElementoAgenda
(
listad
,
dni
)
)
)
;
Nuevonodo
->
dni
=
dni
;
fflush
(
stdin
)
;
//Borra el buffer de teclado
printf
(
"Introduce el nombre: "
)
;
gets
(
Nuevonodo
->
nombre
)
;
printf
(
"Introduce los apellidos: "
)
;
gets
(
Nuevonodo
->
apellidos
)
;
printf
(
"Introduce la direccion: "
)
;
gets
(
Nuevonodo
->
direccion
)
;
Nuevonodo
->
sig
=
NULL
;
Nuevonodo
->
ant
=
NULL
;
if
(
AgendaVacia
(
listad
)
)
listad
=
Nuevonodo
;
else
{
if
(
dni
>
listad
->
dni
)
{
Nuevonodo
->
sig
=
listad
;
listad
->
ant
=
Nuevonodo
;
listad
=
Nuevonodo
;
}
else
{
Paux
=
listad
;
while
(
(
(
Paux
->
sig
)
!=
NULL
)
&&
(
(
dni
<
Paux
->
sig
->
dni
)
)
)
Paux
=
Paux
->
sig
;
if
(
Paux
->
sig
!=
NULL
)
//Si no es el ultimo nodo
Paux
->
sig
->
ant
=
Nuevonodo
;
Nuevonodo
->
sig
=
Paux
->
sig
;
Nuevonodo
->
ant
=
Paux
;
Paux
->
sig
=
Nuevonodo
;
}
}
}
}
/*****************************************************************************************/
void
EliminarElementoAgenda
(
nodoagenda
*
(
&
listad
)
,
int
dni
)
{
nodoagenda
*
actual
=
listad
;
while
(
actual
->
dni
!=
dni
)
actual
=
actual
->
sig
;
if
(
actual
->
ant
==
NULL
)
// Es el primer nodo de la lista
{
if
(
actual
->
sig
!=
NULL
)
// Hay mas de un nodo en la lista
actual
->
sig
->
ant
=
NULL
;
listad
=
actual
->
sig
;
}
else
{
if
(
actual
->
sig
!=
NULL
)
// Es el ultimo nodo de la lista
actual
->
sig
->
ant
=
actual
->
ant
;
actual
->
ant
->
sig
=
actual
->
sig
;
}
free
(
actual
)
;
}
/*****************************************************************************************/
void
MostrarInversoAgenda
(
nodoagenda
*
listad
)
{
nodoagenda
*
paux
=
listad
;
if
(
paux
!=
NULL
)
{
// Recorremos toda la lista hasta el final
while
(
paux
->
sig
!=
NULL
)
paux
=
paux
->
sig
;
// Recorremos toda la lista en orden inverso hasta el primer nodo
while
(
paux
!=
NULL
)
{
printf
(
"nnDNI: %d"
,
paux
->
dni
)
;
printf
(
"nNombre: %s"
,
paux
->
nombre
)
;
printf
(
"nApellidos: %s"
,
paux
->
apellidos
)
;
printf
(
"nDireccion: %s"
,
paux
->
direccion
)
;
paux
=
paux
->
ant
;
}
}
}
/*****************************************************************************************/
void
BorrarAgenda
(
nodoagenda
*
(
&
listad
)
)
{
nodoagenda
*
paux
;
while
(
listad
!=
NULL
)
{
paux
=
listad
;
listad
=
listad
->
sig
;
free
(
paux
)
;
}
}
/*****************************************************************************************/
void
GuardarAgenda
(
nodoagenda
*
listad
)
{
nodoagenda
*
paux
=
listad
;
FILE
*
pFile
;
if
(
paux
!=
NULL
)
{
// Recorremos toda la lista hasta el final
while
(
paux
->
sig
!=
NULL
)
paux
=
paux
->
sig
;
pFile
=
fopen
(
"amigos.txt"
,
"wb"
)
;
//abrir fichero
if
(
pFile
==
NULL
)
puts
(
"nError guardando el fichero."
)
;
else
{
// Recorremos toda la lista en orden inverso hasta el primer nodo
while
(
paux
!=
NULL
)
{
fwrite
(
&
paux
,
sizeof
paux
,
1
,
pFile
)
;
printf
(
"nnDNI: %d"
,
paux
->
dni
)
;
printf
(
"nNombre: %s"
,
paux
->
nombre
)
;
printf
(
"nApellidos: %s"
,
paux
->
apellidos
)
;
printf
(
"nDireccion: %s"
,
paux
->
direccion
)
;
paux
=
paux
->
ant
;
}
if
(
!
fclose
(
pFile
)
)
printf
(
"Fichero Guardadon"
)
;
else
printf
(
"Error: Fichero NO Guardadon"
)
;
}
}
}
/*****************************************************************************************/
void
LeerAgenda
(
nodoagenda
*
listad
)
{
nodoagenda
*
Nuevonodo
;
FILE
*
file
=
fopen
(
"amigo.txt"
,
"rb"
)
;
if
(
file
!=
NULL
)
{
fclose
(
file
)
;
}
}
Gracias de antemano.
Tweet
czealt
Miembro activo
Mensajes: 28
Re: archivos
«
Respuesta #1 en:
Martes 8 de Junio de 2010, 08:04 »
0
Debes reemplazar la linea:
fwrite(&paux, sizeof paux, 1, pFile);
por la siguiente:
fwrite(paux, sizeof(nodoagenda), 1, pFile);
Saludos
faio
Nuevo Miembro
Mensajes: 5
Re: archivos
«
Respuesta #2 en:
Martes 8 de Junio de 2010, 09:30 »
0
Muchas gracias
y la condición para leer la sabrías
czealt
Miembro activo
Mensajes: 28
Re: archivos
«
Respuesta #3 en:
Jueves 10 de Junio de 2010, 04:14 »
0
Bueno, para leer datos de un archivo binario se usa la funcion fread() que acepta los mismos 4 parametros que la funcion fwrite() solo que en lugar de escribir del buffer al disco se lee del disco al buffer.
Ejemplo:
Código: C
void
LeerAgenda
(
)
{
nodoagenda nodo
;
FILE
*
file
=
fopen
(
"amigos.txt"
,
"rb"
)
;
while
(
fread
(
&
nodo
,
sizeof
(
nodoagenda
)
,
1
,
file
)
)
/* fread() devuelve la cantidad de registros leidos, cuando se llega al final del archivo este valor es 0 y el bucle termina. */
{
printf
(
"DNI: %dn"
,
nodo.
dni
)
;
printf
(
"Nombre: %sn"
,
nodo.
nombre
)
;
printf
(
"Apellidos: %sn"
,
nodo.
apellidos
)
;
printf
(
"Direccion: %sn"
,
nodo.
direccion
)
;
}
fclose
(
file
)
;
}
faio
Nuevo Miembro
Mensajes: 5
Re: archivos
«
Respuesta #4 en:
Jueves 10 de Junio de 2010, 15:14 »
0
Gestoragenda.c
Código: C
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include "agenda.h"
char
Menu
(
void
)
;
int
main
(
void
)
{
nodoagenda
*
lista
;
int
num
;
char
op
;
CrearAgenda
(
lista
)
;
do
{
op
=
Menu
(
)
;
switch
(
op
)
{
//***********************************
case
'A'
:
{
if
(
!
AgendaLlena
(
lista
)
)
InsertarAgenda
(
lista
)
;
else
printf
(
"nNo se puede insertar debido a que la lista esta llena."
)
;
break
;
}
//***********************************
case
'B'
:
{
do
{
printf
(
"Introduce el dni de la persona a eliminar: "
)
;
scanf
(
"%d"
,&
num
)
;
}
while
(
num
<
1
)
;
if
(
EstaElementoAgenda
(
lista
,
num
)
)
EliminarElementoAgenda
(
lista
,
num
)
;
else
printf
(
"nEsa persona no se encuentra en la lista."
)
;
break
;
}
//***********************************
case
'C'
:
{
printf
(
"n"
)
;
MostrarInversoAgenda
(
lista
)
;
getch
(
)
;
break
;
}
//***********************************
case
'D'
:
//guardar en fichero
{
printf
(
"n"
)
;
GuardarAgenda
(
lista
)
;
getch
(
)
;
break
;
}
//***********************************
case
'E'
:
//leer de fichero
{
printf
(
"n"
)
;
LeerAgenda
(
)
;
getch
(
)
;
break
;
}
//***********************************
case
'F'
:
//borrar y salir
{
BorrarAgenda
(
lista
)
;
break
;
}
}
}
while
(
op
!=
'F'
)
;
printf
(
"nn"
)
;
system
(
"pause"
)
;
}
char
Menu
(
void
)
{
char
opcion
;
do
{
fflush
(
stdin
)
;
system
(
"cls"
)
;
printf
(
"n***************************************************************** "
)
;
printf
(
"n A - Insertar en Agenda"
)
;
printf
(
"n B - Eliminar de Agenda"
)
;
printf
(
"n C - Mostrar Agenda Orden Creciente"
)
;
printf
(
"n D - Guardar Agenda"
)
;
printf
(
"n E - Leer de Fichero"
)
;
printf
(
"n F - Borrar agenda y Salir"
)
;
printf
(
"n***************************************************************** "
)
;
printf
(
"nIntroduce una opcion: "
)
;
scanf
(
"%c"
,&
opcion
)
;
system
(
"cls"
)
;
opcion
=
toupper
(
opcion
)
;
//tolower
}
while
(
(
opcion
<
'A'
)
||
(
opcion
>
'F'
)
)
;
return
opcion
;
}
agenda.h
Código: C
typedef
struct
nodoagenda
{
int
dni
;
char
nombre
[
15
]
;
char
apellidos
[
25
]
;
char
direccion
[
30
]
;
struct
nodoagenda
*
ant
;
struct
nodoagenda
*
sig
;
}
nodoagenda
;
void
CrearAgenda
(
nodoagenda
*
(
&
)
)
;
int
AgendaVacia
(
nodoagenda
*
)
;
int
AgendaLlena
(
nodoagenda
*
)
;
int
EstaElementoAgenda
(
nodoagenda
*,
int
)
;
void
InsertarAgenda
(
nodoagenda
*
(
&
)
)
;
void
EliminarElementoAgenda
(
nodoagenda
*
(
&
)
)
;
void
MostrarInversoAgenda
(
nodoagenda
*
)
;
void
BorrarAgenda
(
nodoagenda
*
(
&
)
)
;
void
GuardarAgenda
(
nodoagenda
*
)
;
void
LeerAgenda
(
)
;
//
void
CrearAgenda
(
nodoagenda
*
(
&
listad
)
)
{
listad
=
NULL
;
}
/*****************************************************************************************/
int
AgendaVacia
(
nodoagenda
*
listad
)
{
int
dev
=
0
;
if
(
listad
==
NULL
)
dev
=
-
1
;
return
dev
;
}
/*****************************************************************************************/
// Controlaremos la memoria en la insercion de elementos en la lista
int
AgendaLlena
(
nodoagenda
*
)
{
return
0
;
}
/*****************************************************************************************/
// Devuelve -1 si el elemento esta en la lista. 0 en caso contrario
int
EstaElementoAgenda
(
nodoagenda
*
listad
,
int
dni
)
{
nodoagenda
*
Paux
;
int
res
;
Paux
=
listad
;
while
(
(
Paux
!=
NULL
)
&&
(
Paux
->
dni
!=
dni
)
)
Paux
=
Paux
->
sig
;
if
(
Paux
==
NULL
)
res
=
0
;
else
res
=
-
1
;
return
res
;
}
/*****************************************************************************************/
void
InsertarAgenda
(
nodoagenda
*
(
&
listad
)
)
{
nodoagenda
*
Nuevonodo
,
*
Paux
;
int
dni
;
char
nombre
[
15
]
,
apellidos
[
25
]
;
Nuevonodo
=
(
nodoagenda
*
)
malloc
(
sizeof
(
nodoagenda
)
)
;
if
(
Nuevonodo
==
NULL
)
printf
(
"nSe produjo un error en la creación del elemento."
)
;
else
{
do
{
printf
(
"Introduce el dni sin letra: "
)
;
scanf
(
"%d"
,&
dni
)
;
}
while
(
(
dni
<
1
)
||
(
EstaElementoAgenda
(
listad
,
dni
)
)
)
;
Nuevonodo
->
dni
=
dni
;
fflush
(
stdin
)
;
//Borra el buffer de teclado
printf
(
"Introduce el nombre: "
)
;
gets
(
Nuevonodo
->
nombre
)
;
printf
(
"Introduce los apellidos: "
)
;
gets
(
Nuevonodo
->
apellidos
)
;
printf
(
"Introduce la direccion: "
)
;
gets
(
Nuevonodo
->
direccion
)
;
Nuevonodo
->
sig
=
NULL
;
Nuevonodo
->
ant
=
NULL
;
if
(
AgendaVacia
(
listad
)
)
listad
=
Nuevonodo
;
else
{
if
(
dni
>
listad
->
dni
)
{
Nuevonodo
->
sig
=
listad
;
listad
->
ant
=
Nuevonodo
;
listad
=
Nuevonodo
;
}
else
{
Paux
=
listad
;
while
(
(
(
Paux
->
sig
)
!=
NULL
)
&&
(
(
dni
<
Paux
->
sig
->
dni
)
)
)
Paux
=
Paux
->
sig
;
if
(
Paux
->
sig
!=
NULL
)
//Si no es el ultimo nodo
Paux
->
sig
->
ant
=
Nuevonodo
;
Nuevonodo
->
sig
=
Paux
->
sig
;
Nuevonodo
->
ant
=
Paux
;
Paux
->
sig
=
Nuevonodo
;
}
}
}
}
/*****************************************************************************************/
void
EliminarElementoAgenda
(
nodoagenda
*
(
&
listad
)
,
int
dni
)
{
nodoagenda
*
actual
=
listad
;
while
(
actual
->
dni
!=
dni
)
actual
=
actual
->
sig
;
if
(
actual
->
ant
==
NULL
)
// Es el primer nodo de la lista
{
if
(
actual
->
sig
!=
NULL
)
// Hay mas de un nodo en la lista
actual
->
sig
->
ant
=
NULL
;
listad
=
actual
->
sig
;
}
else
{
if
(
actual
->
sig
!=
NULL
)
// Es el ultimo nodo de la lista
actual
->
sig
->
ant
=
actual
->
ant
;
actual
->
ant
->
sig
=
actual
->
sig
;
}
free
(
actual
)
;
}
/*****************************************************************************************/
void
MostrarInversoAgenda
(
nodoagenda
*
listad
)
{
nodoagenda
*
paux
=
listad
;
if
(
paux
!=
NULL
)
{
// Recorremos toda la lista hasta el final
while
(
paux
->
sig
!=
NULL
)
paux
=
paux
->
sig
;
// Recorremos toda la lista en orden inverso hasta el primer nodo
while
(
paux
!=
NULL
)
{
printf
(
"nnDNI: %d"
,
paux
->
dni
)
;
printf
(
"nNombre: %s"
,
paux
->
nombre
)
;
printf
(
"nApellidos: %s"
,
paux
->
apellidos
)
;
printf
(
"nDireccion: %s"
,
paux
->
direccion
)
;
paux
=
paux
->
ant
;
}
}
}
/*****************************************************************************************/
void
BorrarAgenda
(
nodoagenda
*
(
&
listad
)
)
{
nodoagenda
*
paux
;
while
(
listad
!=
NULL
)
{
paux
=
listad
;
listad
=
listad
->
sig
;
free
(
paux
)
;
}
}
/*****************************************************************************************/
void
GuardarAgenda
(
nodoagenda
*
listad
)
{
nodoagenda
*
paux
=
listad
;
FILE
*
pFile
;
int
i
=
0
;
if
(
paux
!=
NULL
)
{
// Recorremos toda la lista hasta el final
while
(
paux
->
sig
!=
NULL
)
paux
=
paux
->
sig
;
pFile
=
fopen
(
"amigos.dat"
,
"wb"
)
;
//abrir fichero
if
(
pFile
==
NULL
)
puts
(
"nError guardando el fichero."
)
;
else
{
// Recorremos toda la lista en orden inverso hasta el primer nodo
while
(
paux
!=
NULL
)
{
fwrite
(
paux
,
sizeof
(
nodoagenda
)
,
1
,
pFile
)
;
paux
=
paux
->
ant
;
}
if
(
!
fclose
(
pFile
)
)
printf
(
"Fichero Guardadon"
)
;
else
printf
(
"Error: Fichero NO Guardadon"
)
;
}
}
}
/*****************************************************************************************/
void
LeerAgenda
(
)
{
nodoagenda nodo
;
FILE
*
pFile
=
fopen
(
"amigos.dat"
,
"rb"
)
;
while
(
fread
(
&
nodo
,
sizeof
(
nodoagenda
)
,
1
,
pFile
)
)
/* fread() devuelve la cantidad de registros leidos, cuando se llega al final del archivo este valor es 0 y el bucle termina. */
{
printf
(
"DNI: %dn"
,
nodo.
dni
)
;
printf
(
"Nombre: %sn"
,
nodo.
nombre
)
;
printf
(
"Apellidos: %sn"
,
nodo.
apellidos
)
;
printf
(
"Direccion: %sn"
,
nodo.
direccion
)
;
}
fclose
(
pFile
)
;
}
Muchisimas gracias
, Ahora va perfecto.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
archivos