Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Fwrite

Iniciado por nsL, 27 de Agosto de 2004, 12:53:38 AM

« anterior - próximo »

nsL

 a ver is me entero bien...
La funcion fwrite(); de stdio.h se supone q escribe un bloque de bytes , visto byte a byte segun un libro q tengo...
Si compilo este codigo:


#include "stdio.h"

struct
{
int num;
char nom[30];
}reg;


void main(){


FILE *flujo=NULL;
flujo = fopen("omarin.dat","w");
reg.num = 99;
gets(reg.nom);
fwrite(®,sizeof(reg),1,flujo);
fclose(flujo);

}


me crea el fichero omarin.dat.., hasta ahi todo bien
pero cuando lo abro pasan 2 cosas:

Desde un windows 98 me trae esto: c joderrrr yaaa (el texto q le meti) (la c es el 99 en ascii)
pero desde un WindowsXP me trae: c jo (creo recordar)

y eso para un registro, si intento escribir una cadena de caracteres simplemente en el 98 me crea el fichero con la cadena de caracteres legible y los caracteres en blanco del final (hasta completar el array de caracteres) con letras Ì
mientras que si hago lo de esa cadena en un XP me escribe unos cuadrados, menos una J por ahi metida....

los ficheros los leo desde el bloc de notas por si habia duda...

si se supone que fwrite escribe en bloques de bytes, no deberia poder leerse desde un editor de texto no?, lo del XP me parece lo mas razonable, pero desde el 98 me lee todo a la perfeccion....

y de no ser asi, q alguien me explique como hace la gente esos ficheros .dat o .loquesea que los abres y son ilegibles..., yo pensaba que era con el fwrite pero ya no se que pensar  :blink:

weno, gracias de antemano, y espero que se entienda lo que puse, que a estas horas estoy espeso  :D  
Yo no muero hasta la muerte -

Pogacha

 Si, no te entendí bien.
Pero veo que a tu codigo le falta algo importante y dibagaré un poco a ver si te ayudo.
Existen dos tipos de archivo, los archivos de texto y los binarios.
Los archivos binarios son una secuencia de bytes, pero los de textos tiene formato propio.
El formato de los archivos de texto es medio complejo para el uso que se le da y creo no tiene sentido estudiar estas caracteristicas, ya que no te sirven para hacer un parser para leer una configuración o simplemente escribir una cadena de texto en un archivo.
En los archivos binarios tienes carta blanca, puedes escribir lo que quieras, cadenas de caracteres, estructuras, enteros, volcados de memoria en general, no asi en los de texto, que tienes un numero limitado de caracteres para usar, otros son codigos que representan distintas acciones para quien lo valla a leer, muchos de estos codigos vienen de comandos de impresoras, lecturas secuenciales y los primeros programas de edicion de texto que resultaban malisimos, no es necesario que los sepas, solo debes saber que en los archivos de textos solo puedes escribir texto, igual que con el notepad y para leerlos usando las librerias stdio.h y demas no tendras problemas mayores.
En los archivos binarios lo que uno realmente hace es un "volcado binario", se anexan secuencialmente bloques de bytes tomados ordenadamente de la memoria, al abrirlo con un editor de texto, el editor intentara abrirlo como un archivo de texto, no solo se topará con el problema con que convertira a un entero de 4 bytes o 2 en tu caso a un par de caracteres, sino que estos caracteres pueden representar ordenes para el editor de texto (retorno de carro, alimentación de linea, tabulación), por ende lo que puedas ver en un editor de texto no es confiable, generalmente estos comandos de control son pocos y muchas veces obviados por los editores ya que han perdido funcionalidad.

Para acceder a un archivo de texto debieras hacer:

FILE *f; // el =NULL; esta demas, ya que lo primero que haces es reasignarlo
f = fopen("omarin.txt","wt"); // fijate en "wt" = escritura en modo texto, el .txt no importa para nada
if(f!=NULL)   // siempre comprobar si pudo, si no se te puede colgar el ordenador
{
reg.num = 99;
gets(reg.nom);
fprintf(f,"%d\n",reg.num); // Si no conoces estas funciones te recomiendo
                                        // estudialas, cada una tiene lo suyo
fputs(f,reg.nom);  // tambien fijate la sintesis no recuerdo si
                           // fputs(f, reg.nom) o fputs( reg.nom, f), = para el fprintf()
fclose(f);
}

Y asi veras el numero como numero y la cadena en el siguiente renglon en el NotePad

Para un archivo binario, lo que pones esta bien, solo agregale

f = fopen("omarin.dat","wb"); // que ahora es "wb" write binarary o sea escritura en modo binario


Para leer desde tu programa un archivo texto

char c[31]; // c es un buffer
FILE *f;
f = fopen("omarin.txt","rt"); // fijate en "rt" = lectura en modo texto
if(f!=NULL)  
{
reg.num = 99;
fgets(c, 31, f);  // leo en el buffer, fijate la sintaxis nuevamente, no me acuerdo
sscanf(c,"%d",®.num); // de c escaneo un %d=entero, y lo pongo en reg.num
                                         // & significa en la direccion de memoria de
fgets(red.nom, 31, f);  // leo en el registro directamente, ya que es una cadena de caracteres.
fclose(f);
}


En definitiva para un archivo de texto, tengo que convertir los datos enteros, flotantes y demas a modo texto, las cadenas de caracteres safan bastante bien, mientras no contengan saltos de linea que se complica un poco mas; y al cargarlo debo volver a reconvertirlo a mis datos originales, enteros, flotantes y demas.

En el archivo binario en cambio no solo vuelco lo que hay en la memoria.

Ambos tienen sus pros y sus contras, los tipo texto, se pueden editar facil en un editor de texto, y se utilizan generalmente para guardar configuraciónes o cosas que quieras poder editar facilmente. En cambio los binarios ocupan menos espacio y son de una carga y escritura mas velos, no obstante mal utilizados pueden ser contraproducente, si abres un archivo de texto en modo binario (lo cual se puede perfectamente sin esperar ningun error) resultara mas lenta la lectura que si lo abrieses en modo texto.

Espero que le halla pegado a tu problema.
Saludos
Pogacha

Edit : nunca puedo escribirlo bien de primera  :lol:
Edit 2: write x white  

nsL

 weno, mas o menos eso de los modos wb, wt ya lo sabia, algo lei en el libro :P
pero es que aun poniendo modo wb pa que abra el fichero en modo binario si escribo con fwrite los numeros me los sigue poniendo como letras, como si fuese en modo texto...
sin embargo si lo hago como dices tu, con fprintf(...) me escribe el numero  :blink:

es que me interesa usar el fwrite por que me escribe ya el bloque entero de bytes... si lo hago con fprintf tendria que ir escribiendo en el fichero campo por campo la estructura...


por ejemplo, un archivo de informacion de un juego de coches, que guarda el perfil de cada usuario que se agrega (tipico de los juegos, que tienes q hacerte un personaje-perfil- para jugar) y guarda en un archivo esta informacion (a ver si se ve bien):

Archivo: WaaghMan.per
trae esto dentro:    WaaghManÿ" áß ü'

waaghman es el normbre del jugador, lo que no entiendo es que son los demas caracteres... que ha escrito el tio este en formato binario para que no se lea, porq yo por mas numeros y caracteres y pijadas que meto, ya sea en formato binario o de texto, se me lee a la perfeccion, salvo si añado un \n que se me lee como un 

puede que este haciendo el ridiculo  :P  pero weno, es que C es nuevo pa mi :D
gracias por ayudar, a ver si tiene coherencia lo que dije esta vez  :)
Yo no muero hasta la muerte -

Pogacha

 No hay problema todos empezamos de cero , no tengas miedo en hacer el ridiculo  :lol:, pero lo mas importante es que trates de resolverlo tu mismo.
Creo que te confundes en algun lado pero no veo claramente en donde, cuando escribes en un archivo binario, no debes utilizar fprinft, eso solo sirve para archivos de texto, por mas que el ordenador no se cuelgue no te ayudara y es un grave error conceptual.
Citarsi se supone que fwrite escribe en bloques de bytes, no deberia poder leerse desde un editor de texto no?, lo del XP me parece lo mas razonable, pero desde el 98 me lee todo a la perfeccion....
Esto que dices no tiene consistencia. Desde un editor de texto como el notepad, solo puedo leer archivos de texto, si leo uno binario me puede mostrar cualquier cosa.

Para escribir un archivo binario no debo utilizar fprintf o fput sino solamente fwrite

Para escribir un archivo de texto no debo utilizar fwrite, solo puedo utilizar fprintf o fput y demas de ese estilo.

En realidad un entero tiene una longitud fija, puede ser 2 o 4 bytes, y cuando lo leas en el notepad, tendras esa cantidad de caracteres ordenados de atras para adelante por ocurrencia de intel, o sea el byte menos significativo primero, y luego el mas significativo, tambien en la memoria se guardan de esta manera.

Por cierto te recomiendo que cuando no conozcas de algun tema lo investigues, como la forma de memoria.

En tu win98 parece que escribe los caracteres del codigo ascii sin importar nada, en tu winxp parece que los caracteres que considera erroneos, los marca con un cuadrado, pero no debes fiarte de lo que ves en el notepad, si quieres ver bien un archivo binario deveras concegirte un programa de volcado de archivos como era el norton-viewer o alguno parecido que te muestran el valor en numero decimal o hexadecimal de cada byte, la verdad es que no conozco programas nuevos de este tipo.

Ahora te toca a ti

nsL

 gracias :P enredare algo mañana, q toi liao con los examenes, ya te contare ;)
Yo no muero hasta la muerte -






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.