Discussion:
ficheros de texto
(demasiado antiguo para responder)
Olaf "El Blanco"
2006-04-13 15:41:00 UTC
Permalink
El siguiente programa, crea un fichero de MAX números. Luego los imprimo.
Si, muy simple, pero tengo una pregunta.

#include <stdio.h>
#define MAX 100
int main()
{
int n;
FILE * fnumbers;
fnumbers=fopen("numeros.txt", "w");
for (n=0; n<=MAX; n++)
fprintf (fnumbers, "%d\t", n);
fclose (fnumbers);
/**************************************/
fnumbers=fopen("numeros.txt", "r");
fscanf(fnumbers, "%d", &n);
while (!feof(fnumbers)) {
printf ("%d\n", n);
fscanf(fnumbers, "%d", &n);
}
fclose (fnumbers);
system("PAUSE");
return 0;
}

El fichero que creo tiene el siguiente formato: 0<TABULADOR>1<TABULADOR>
etc...
Cuando lo imprimo... no tiene en cuanta esos tabuladores...
Tengo entendido que cada tabulador, es guardado como un byte (del ASCII),
pero ¿porque a la hora de imprimirlo en pantalla, no se tiene en cuenta eso?
No es que sea importante, pero quiero entenderlo.
Hago avanzar un apuntador que va guardando los chars (transformados en
enteros) en la variable 'n', Cuando hago avanzar ese apuntador (con cada
fscanf) ¿Como sabe que tiene que avanzar una serie de bits del numero, y
luego otra serie de bits para el tabulador??
Alberto Giménez
2006-04-13 20:42:25 UTC
Permalink
Post by Olaf "El Blanco"
fnumbers=fopen("numeros.txt", "r");
fscanf(fnumbers, "%d", &n);
while (!feof(fnumbers)) {
printf ("%d\n", n);
fscanf(fnumbers, "%d", &n);
}
El fichero que creo tiene el siguiente formato: 0<TABULADOR>1<TABULADOR>
etc...
Cuando lo imprimo... no tiene en cuanta esos tabuladores...
Tengo entendido que cada tabulador, es guardado como un byte (del ASCII),
pero ¿porque a la hora de imprimirlo en pantalla, no se tiene en cuenta eso?
No es que sea importante, pero quiero entenderlo.
Hago avanzar un apuntador que va guardando los chars (transformados en
enteros) en la variable 'n', Cuando hago avanzar ese apuntador (con cada
fscanf) ¿Como sabe que tiene que avanzar una serie de bits del numero, y
luego otra serie de bits para el tabulador??
fscanf() no es *ni mucho menos* una función que trabaje a bajo nivel
(apuntador, bytes, ...). Es una manera de leer datos formateados.

De hecho, no se aconseja mucho su uso, sino la combinación fgets (para
leer líneas enteras) + sscanf (para 'parsear' la línea con un formato
conocido), debido a que fscanf se pelea bastante con los espacios en
blanco, newlines, y con las demás funciones de lectura de datos.

Lo que hace fscanf realmente es *ignorar los espacios en blanco* (de ahí
que desaparezca tu tabulador) y leer *sólo lo que le pides*. Es decir,
si le pides que te lea un decimal, te leerá *un decimal*. No un
tabulador, ni "avanzará" el puntero al siguiente "byte".

Consejo que ha sido hecho hasta la saciedad: fgets + sscanf (o strtok, o
alguna otra función de parseo). Como mucho, podrías hacer algo como:

fscanf(fp, "%d%c%d" ...

Con un poco de suerte te cojería el tabulador como un carácter
regular... pero vamos...

Saludos
--
Luis Alberto Giménez
JabberID: ***@bulmalug.net
GnuPG ID: 0x3BAABDE1
Loading...