elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Función fread y saltos de línea
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Función fread y saltos de línea  (Leído 6,023 veces)
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Función fread y saltos de línea
« en: 19 Marzo 2013, 00:25 am »

Buenas a todos, mi problema es que no entiendo ciertas cosas sobre los ficheros, más concretamente la diferencia entre ficheros binarios y de texto, las funciones para cada tipo...

Por ejemplo, en un examen de otro día, teníamos en un archivo de extensión .dat (entiendo que es binario, así que lo abrí como tal). Se trataba de un censo con la información de los habitantes, y si cumplían ciertos requisitos, había que copiarlos a un fichero .txt. No se me ocurrió otra forma que hacerlo con fgets, para tener en cuenta los saltos de línea, asumiendo que cada habitante está en una línea (¿cómo puedo hacerlo con fread?). Y claro, lo hice mal (y éso que con fgets funciona sin problema). Por éso, no tengo nada claro por qué con una función sí y con otra no, y cómo usarla...

Gracias de antemano y saludos.


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Función fread y saltos de línea
« Respuesta #1 en: 19 Marzo 2013, 05:32 am »

mi problema es que no entiendo ciertas cosas sobre los ficheros, más concretamente la diferencia entre ficheros binarios y de texto
La diferencia principal entre un stream binario y uno en modo texto es: en este ultimo el carácter o caracteres utilizados para indicar el avance de linea (por ejemplo '\r' + '\n' en MS Windows) se convierten de forma transparente a '\n' en las operaciones de lectura. Y cuando escribes en el archivo todo '\n' se convierte apropiadamente (siguiendo el ejemplo cada '\n' se sustituye por el par '\r' + '\n').

Eso no sucede con un stream en modo binario.

No se me ocurrió otra forma que hacerlo con fgets, para tener en cuenta los saltos de línea, asumiendo que cada habitante está en una línea (¿cómo puedo hacerlo con fread?).
No es posible ya que fgets lee por linea (si no sobrepasa el máximo indicado) mientras que fread lee por bloque, puedes utilizar esta ultima para leer N caracteres pero no sabrás cuantas lineas se leyeron (debes escanear el bloque para contar manualmente los '\n').

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Función fread y saltos de línea
« Respuesta #2 en: 19 Marzo 2013, 10:52 am »

Muchas gracias por responder. Entonces, si lo hago con fread, tendría que mirar yo mismo manualmente los '\n' (si es que se supone que para habitante del censo del fichero .dat hay una línea).

Gracias y saludos
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Función fread y saltos de línea
« Respuesta #3 en: 19 Marzo 2013, 16:14 pm »

Entonces, si lo hago con fread, tendría que mirar yo mismo manualmente los '\n'
Correcto

es que se supone que para habitante del censo del fichero .dat hay una línea
Entonces lo mejor es utilizar fgets para leer por linea (y por ende por registro). Si necesitas separar la linea en componentes (nombre, dirección, etc.) puedes utilizar funciones como strtok.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Función fread y saltos de línea
« Respuesta #4 en: 19 Marzo 2013, 18:16 pm »

Correcto
Entonces lo mejor es utilizar fgets para leer por linea (y por ende por registro). Si necesitas separar la linea en componentes (nombre, dirección, etc.) puedes utilizar funciones como strtok.

Un saludo
Éso es lo que pienso yo, pero nos dijeron que con ficheros binarios había que utilizar fread, no fgets...
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Función fread y saltos de línea
« Respuesta #5 en: 20 Marzo 2013, 02:21 am »

Supongo se refiere (¿Tu profesor?) a que si almacenas en un archivo un bloque de memoria con fwrite debes leerlo con fread. El caso usual es cuando se almacena en el archivo un array de estructuras con campos de tipo int, double, etc.

Pero si ese es el caso ya no estamos tratando con un archivo cuyo contenido son lineas de texto.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Función fread y saltos de línea
« Respuesta #6 en: 20 Marzo 2013, 10:21 am »

Una última cuestión. Suponiendo que el censo contiene datos de miles de personas, ¿cuál sería la estrategia para ver cada una de ellas, usando fread? Porque con fgets es sencillo, pero no tengo claro cómo sería con fread, con tantos datos. Porque la cuestión es que cada persona tendrá varios datos, y necesito tener en cuenta uno en concreto (la fecha de nacimiento) para escoger a quién copiar en un segundo fichero .txt que crearé.
« Última modificación: 20 Marzo 2013, 10:31 am por NathanD » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Función fread y saltos de línea
« Respuesta #7 en: 20 Marzo 2013, 17:23 pm »

Si un array de estructuras se almaceno en un archivo mediante fwrite debes leerlo con fread. Lo usual es leer un bloque de estructuras y almacenarlo en un array, después de procesarlo lees otro bloque, eso lo implementas mediante un bucle.

Mas o menos así:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NOM_ENTRADA  "Entrada.dat"
  5. #define LONG_MAX_CADENA  128
  6. #define MAX_REGS  64
  7.  
  8. struct reg {
  9.   char nombre[LONG_MAX_CADENA];
  10.   char direccion[LONG_MAX_CADENA];
  11.   struct {
  12.      int dia;
  13.      int mes;
  14.      int anio; /* Es a n i o pero el foro lo cambia ... */
  15.   }fnac;
  16. };
  17.  
  18. int main(void)
  19. {
  20.   FILE *entrada;
  21.   struct reg reg[MAX_REGS];
  22.   size_t num_regs;
  23.  
  24.   if ((entrada = fopen(NOM_ENTRADA, "rb")) == NULL){
  25.      perror(NOM_ENTRADA);
  26.      return EXIT_FAILURE;
  27.   }
  28.  
  29.   while ((num_regs = fread(reg, sizeof(struct reg), MAX_REGS, entrada)) > 0){
  30.  
  31.      /* Procesamos "num_regs" registros */
  32.  
  33.   }
  34.   fclose(entrada);
  35.  
  36.   return EXIT_SUCCESS;
  37. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Función fread y saltos de línea
« Respuesta #8 en: 20 Marzo 2013, 20:25 pm »

Hay una cosa en el código que no entiendo (siento ser tan pesado). Cuando hago lo siguiente:

Código
  1. while( ! feof(fichero) )
  2.    {
  3.           num_regs = fread(reg, sizeof(struct reg), MAX_REGS, entrada);
  4.           /*********************/
  5.  

Ahí se copia todo el contenido del fichero en reg[0].nombre, lo cual no entiendo muy bien.

Gracias de antemano y perdón por las molestias
 
Edito:

Vale, era porque en el fichero no había escrito con fwrite. Ahora creo que lo entiendo todo. Muchas gracias por tu ayuda y paciencia.
« Última modificación: 21 Marzo 2013, 03:36 am por NathanD » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
contar saltos de linea RichTextBox VB
Programación Visual Basic
Carlosnuel 5 12,952 Último mensaje 6 Abril 2007, 01:55 am
por CeLaYa
Saltos de linea
PHP
zhynar_X 2 5,575 Último mensaje 8 Septiembre 2007, 17:59 pm
por дٳŦ٭
Script JS o PHP para dar saltos de linea
PHP
H4RR13R 8 4,752 Último mensaje 19 Febrero 2008, 13:21 pm
por H4RR13R
fread o alguna funcion para leer un bloc de notas
Programación C/C++
Erres 8 7,260 Último mensaje 5 Octubre 2012, 18:19 pm
por Erres
Problema en C con la funcion fread y fwrite
Programación C/C++
M01535 7 6,349 Último mensaje 1 Abril 2015, 18:05 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines