Viernes 15 de Noviembre de 2024, 04:56
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
) »
Problema con fread()
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Problema con fread() (Leído 2361 veces)
granzeta
Nuevo Miembro
Mensajes: 3
Problema con fread()
«
en:
Miércoles 22 de Junio de 2011, 01:14 »
0
Saludos al foro
haciendo mis practicas en C, he realizado un programa que Graba y lee una matriz de 25 enteros, la grabación con fwrite() es OK, pero al leer el archivo con fread() solo me recupera 12 de los 25 elementos grabados.
Código: C
ret
=
fwrite
(
&
matriz
,
object_size
,
object_count
,
flujo
)
;
//OK "ret" devuelve 25
ret
=
fread
(
&
matriz
,
object_size
,
object_count
,
flujo
)
;
//FALLO "ret" devuelve 12
fread me devuelve el numero de objetos grabados (en "ret"); Este valor debe a su vez debe coincidir con object_count que es 25, igual que en fwrite.
matriz grabada ---> matriz leida
2 4 6 8 10 ---> 2 4 6 8 10
12 14 16 18 20 ---> 12 14 16 18 20
22 24 26 28 30 ---> 22 24 0 0 0
32 34 36 38 40 ---> 0 0 0 0 0
42 44 46 48 50 ---> 0 0 0 0 0
Detalles Sistema
SO: Windows XP, Compilador: gcc 4.5.2 (MinGW)
codigo completo
Código: C
int
fila
,
col
;
int
matriz
[
5
]
[
5
]
=
{
2
,
4
,
6
,
8
,
10
,
12
,
14
,
16
,
18
,
20
,
22
,
24
,
26
,
28
,
30
,
32
,
34
,
36
,
38
,
40
,
42
,
44
,
46
,
48
,
50
}
;
int
main
(
)
{
FILE
*
flujo
;
int
close_error
;
char
archivo
[
]
=
"numbers.dat"
;
size_t
object_size
=
sizeof
(
int
)
;
size_t
object_count
=
25
;
size_t
ret
;
/*Valores Iniciales*/
imprime_matriz
(
)
;
flujo
=
fopen
(
archivo
,
"w"
)
;
ret
=
fwrite
(
&
matriz
,
object_size
,
object_count
,
flujo
)
;
printf
(
"elementos grabados %dn"
,
ret
)
;
if
(
ret
!=
object_count
)
printf
(
"Error al excribir datos al archivon"
)
;
close_error
=
fclose
(
flujo
)
;
/*VACIAMOS LA MATRIZ A CEROS*/
for
(
fila
=
0
;
fila
<=
4
;
fila
++
)
{
for
(
col
=
0
;
col
<=
4
;
col
++
)
{
matriz
[
fila
]
[
col
]
=
0
;
}
}
/*LEEMOS EL ARCHIVO*/
flujo
=
fopen
(
archivo
,
"r"
)
;
ret
=
fread
(
&
matriz
,
object_size
,
object_count
,
flujo
)
;
printf
(
"elementos retornados %dn"
,
ret
)
;
if
(
ret
!=
object_count
)
printf
(
"Error leyendo data desde archivo...!n"
)
;
imprime_matriz
(
&
matriz
)
;
fclose
(
flujo
)
;
return
0
;
}
void
imprime_matriz
(
)
{
for
(
fila
=
0
;
fila
<=
4
;
fila
++
)
{
for
(
col
=
0
;
col
<=
4
;
col
++
)
printf
(
"%d "
,
matriz
[
fila
]
[
col
]
)
;
printf
(
"n"
)
;
}
}
Tweet
ProfesorX
Moderador
Mensajes: 796
Nacionalidad:
Re: Problema con fread()
«
Respuesta #1 en:
Miércoles 22 de Junio de 2011, 03:27 »
0
Encontre la fuente de tu problema.
Resulta que bajo windows hay 2 modos de abrir los archivos, en modo binario y en modo texto.
En modo texto la secuencia 0A en este caso se traduce erroneamente como el fin de una linea, entonces al leer/escribir divide el contenido en lineas, y por eso trunca el contenido. De hecho, el tamaño de tu archivo era de 101 bytes y no 100 bytes (25x4) como debia ser, ya que convertia el 0A en 0D 0A al escribir. En windows cada linea lleva un retorno de carro / avance de linea, en linux solo existe el avance de linea 0A, y todos los archivos se manejan como si fueran binarios.
Si no especificas el modo, los archivos se abren por defecto en modo texto.
La solucion es especificar
explicitamente
que vas a abrir el archivo en modo binario, de esa forma se elimina el problema.
Debes cambiar las siguientes lineas:
Código: C++
flujo
=
fopen
(
archivo,
"w"
)
;
por
Código: C++
flujo
=
fopen
(
archivo,
"wb"
)
;
y
Código: C++
flujo
=
fopen
(
archivo,
"r"
)
;
por
Código: C++
flujo
=
fopen
(
archivo,
"rb"
)
;
Saludos
NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================
granzeta
Nuevo Miembro
Mensajes: 3
Re: Problema con fread()
«
Respuesta #2 en:
Miércoles 22 de Junio de 2011, 04:15 »
0
Muchas gracias
profesorX
, su explicación y conclusión es detallada y exacta respectivamente.
Realmente esta genial su explicación
de gran ayuda.
Asi que PROBLEMA SOLUCIONADO.
Saludos
Epa
Miembro MUY activo
Mensajes: 242
Nacionalidad:
Re: Problema con fread()
«
Respuesta #3 en:
Jueves 23 de Junio de 2011, 22:22 »
0
Aunque eso te soluciona el problema, sigue habiendo un error.
En tu caso no afecta por la forma en que defines la matriz.
pero esto
Código: C
ret
=
fwrite
(
&
matriz
,
object_size
,
object_count
,
flujo
)
;
//OK "ret" devuelve 25
ret
=
fread
(
&
matriz
,
object_size
,
object_count
,
flujo
)
;
//FALLO "ret" devuelve 12
deberia ser
Código: C
ret
=
fwrite
(
matriz
,
object_size
,
object_count
,
flujo
)
;
//OK "ret" devuelve 25
ret
=
fread
(
matriz
,
object_size
,
object_count
,
flujo
)
;
//FALLO "ret" devuelve 12
ya que si tu matriz es dinamica estarias escribiendo y lellendo de cualquier lado.
Saludos
The sweet smell of a great sorrow lies over the land.
granzeta
Nuevo Miembro
Mensajes: 3
Re: Problema con fread()
«
Respuesta #4 en:
Sábado 25 de Junio de 2011, 00:43 »
0
Gracias, sus comentarios son de mucha ayuda cuando se esta aprendiendo a programar en C.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problema con fread()