Autor
|
Tema: Función fread y saltos de línea (Leído 5,989 veces)
|
NathanD
Desconectado
Mensajes: 48
|
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
Mensajes: 1.639
|
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
Mensajes: 48
|
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
Mensajes: 1.639
|
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
Mensajes: 48
|
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
Mensajes: 1.639
|
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
Mensajes: 48
|
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
Mensajes: 1.639
|
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í: #include <stdio.h> #include <stdlib.h> #define NOM_ENTRADA "Entrada.dat" #define LONG_MAX_CADENA 128 #define MAX_REGS 64 struct reg { char nombre[LONG_MAX_CADENA]; char direccion[LONG_MAX_CADENA]; struct { int dia; int mes; int anio; /* Es a n i o pero el foro lo cambia ... */ }fnac; }; int main(void) { FILE *entrada; struct reg reg[MAX_REGS]; size_t num_regs; if ((entrada = fopen(NOM_ENTRADA , "rb")) == NULL ){ return EXIT_FAILURE; } while ((num_regs = fread(reg , sizeof(struct reg ), MAX_REGS , entrada )) > 0){ /* Procesamos "num_regs" registros */ } return EXIT_SUCCESS; }
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
Mensajes: 48
|
Hay una cosa en el código que no entiendo (siento ser tan pesado). Cuando hago lo siguiente: { num_regs = fread(reg , sizeof(struct reg ), MAX_REGS , entrada ); /*********************/
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
contar saltos de linea RichTextBox VB
Programación Visual Basic
|
Carlosnuel
|
5
|
12,918
|
6 Abril 2007, 01:55 am
por CeLaYa
|
|
|
Saltos de linea
PHP
|
zhynar_X
|
2
|
5,565
|
8 Septiembre 2007, 17:59 pm
por дٳŦ٭
|
|
|
Script JS o PHP para dar saltos de linea
PHP
|
H4RR13R
|
8
|
4,731
|
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,216
|
5 Octubre 2012, 18:19 pm
por Erres
|
|
|
Problema en C con la funcion fread y fwrite
Programación C/C++
|
M01535
|
7
|
6,315
|
1 Abril 2015, 18:05 pm
por rir3760
|
|