Mis preguntas son:
¿Por qué el carácter '\n' no lo imprime cuando lo lee?
El número 20 se lo salta al terminar de leer la primera línea, ¿Por qué?
fscanf lee '\n' ? '\n' es un char, cierto?
Espero sus respuestas
Como dices, "\n" es un carácter, pero la directiva de matching "%c", según el manual, salta todos los caracteres "white-space", (entendiendo estos como el spacio, el tablador, el fin de línea... todos los que responden a
isspace(int c) ).
Si te fijas en la salida , salta del 19 al 21...
Otra aspecto tiene que ver con
printf. Propimaente hablando, el caracter '\n' no es carácter imprimible, segun (
isprint(c)) , sino de control
iscntrl(c). En el caso de "\n" dicen que "debe" hacer un
scrolling de 1 y empezar en la primera columna, no que imprima propiamente un caracter...
Una solución pasa por dejar usar las rutinas "high-level IO", los streams, a las de "low-level IO", los "file descriptors".
El incoveniente es que perdemos la funcionalidad de la rutina
pero que podemos simular con
pos=lseek(fd,0,SEEK_CUR)
Por supuesto, para dar una salida formateada, debo volver a las rutinas "high-level" IO, como
printf... Pero es un problema aparte de el de lectura
readHay otro error, que ya muestro corregido, relatio a la función
feof()... Esta función sólo tiene valores coherentes
después de haber invocado la correspondiente
fscanf, es decir, no puede anticipar si la cabeza lectora ha llegafo a fin de fichero..
Ahí va mi propuesta.
#include <stdlib.h> // exit()...
#include <assert.h> // assert
#include <unistd.h> // open,read,close (Low-level IO),
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> // open,O_RDONLY...
#include <stdio.h> //p printf
#include <ctype.h> // isprint
int main()
{
char c;
int n;
int fd;
const char *pattern="%d\t%c\t%d\n";
char row[80];
if (!(fd=open("texto.txt",O_RDONLY)))
{
}
printf("ASCII\tPrint\tPos\n"); while((n=read(fd,&c,sizeof(char)))> 0)
{
if ((n
=sprintf(row
,pattern
,c
,isprint(c
)?c
:' ',lseek
(fd
,0,SEEK_CUR
)))<0) {
}
}
if (n==-1)
{
}
close(fd);
}
Pasándole el fichero de texto propuesto
supholasadkjholasad
adholadsa
El programa arroja la salida siguiente: Cuando es imprimible, imprime su símbolo, cuando es de control, en su lugar, un espacio. (Los números que salen al principio los pone el codgo GeSHi del web, porque si no, perdía el formato de salida... un lío vamos)
ASCII Print Pos
115 s 1
117 u 2
112 p 3
104 h 4
111 o 5
108 l 6
97 a 7
115 s 8
97 a 9
100 d 10
107 k 11
106 j 12
104 h 13
111 o 14
108 l 15
97 a 16
115 s 17
97 a 18
100 d 19
10 20
97 a 21
100 d 22
104 h 23
111 o 24
108 l 25
97 a 26
100 d 27
115 s 28
97 a 29
10 30