1
/*******************************************************
2
Programa para familiarizarse con las funciones para
3
trabajar con ficheros binarios
4
*******************************************************/
14
typedef struct persona
23
char * cgets(char *str);
24
unsigned atou(char *str);
32
printf("\nRellene los siguientes campos: ");
35
socio.edad=atou(cgets(aux));
36
printf("\n\nNombre: ");
38
strcpy(socio.nombre,cgets(aux));
41
strcpy(socio.sexo,cgets(aux));
42
printf("\n\nGracias, pulse una tecla para continuar...");
44
fbin=fopen("personas.dat","ab");
46
fwrite(&socio, sizeof(PERSONA), 1, fbin);
51
/*=========================================================================================================================================*/
53
unsigned atou(char *str)
55
unsigned Pow(unsigned base, unsigned exp)
63
unsigned i, len, end, pos, result;
67
if (str[0]=='-' || str[0]=='+') end=1;
69
while((pos>=end) && (pos<=len))
72
if ((str[pos]>='0') && (str[pos]<='9'))
74
result+=(unsigned)((str[pos--]-'0')*(Pow(10,i)));
77
else /*if (str[pos]=='.')*/
86
/********************************************
89
Recoge un caracter de la entrada estándar
90
sin echo y sin buffer.
92
Devuelve el char del caracter leido.
94
<termios.h>, <unistd.h>
95
********************************************/
99
struct termios old = {0};
100
if (tcgetattr(0, &old) < 0)
101
perror("tcsetattr()");
102
old.c_lflag &= ~ICANON;
103
old.c_lflag &= ~ECHO;
106
if (tcsetattr(0, TCSANOW, &old) < 0)
107
perror("tcsetattr ICANON");
108
if (read(0, &buf, 1) < 0)
110
old.c_lflag |= ICANON;
112
if (tcsetattr(0, TCSADRAIN, &old) < 0)
113
perror ("tcsetattr ~ICANON");
117
/*******************************************************************************
118
Funcion: cgets Autor: Rafael Belmonte Fecha: enero de 2011
122
racgets lee una cadena de caracteres desde la consola, guardando la cadena
123
(y la longitud de la cadena) en la dirección de memoria a la que apunta str.
124
racgets lee caracteres hasta que encuentra un carácter de salto de línea \n
125
o hasta que han sido leidos el máximo número de caracteres permitido.
126
Si racgets lee un salto de línea, lo reemplaza por un caracter nulo o fin
127
de cadena \0 antes de guardar la cadena.
129
Antes de llamar a racgets, guarde en str[0] la máxima longitud de la cadena
131
A la salida de la función, en str[1] queda guardado el número de caracteres
133
Los caracteres leidos comienzan en posición str[2] y terminan con un nulo.
134
Por lo que str debe tener al menos una longitud de str[0] + 3 bytes.
137
La función recibe un puntero a char, que apunta al comienzo de una cadena
141
La función devuelve un puntero que apunta a str[2], ya que es en la posición
142
2 donde comienzan los caracteres leidos.
143
*******************************************************************************/
145
/***PROTOTIPOS LOCALES***/
146
/*unsigned PilaExt(PILA *);
147
void PilaFree(PILA *);
148
short PilaIns(PILA *, unsigned);
149
short PilaIni(PILA *, unsigned);
151
short PilaVacia(PILA)*/
153
char * cgets(char *str)
155
/***DEFINIR TIPOS***/
162
/*******************/
163
/***FUNCIONES LOCALES*******/
166
putc(8,stdout); /*Si se presiona borrar, se borra*/
170
short PilaIni(PILA * pilita, unsigned tam)
174
pilita->dato=(unsigned *)malloc(tam*sizeof(unsigned));
175
if (pilita->dato) return 0;
179
short PilaVacia(PILA pilita)
186
short Push(PILA * pilita, unsigned item)
188
if (pilita->top<pilita->max)
190
pilita->dato[pilita->top++]=item;
195
void PilaFree(PILA * pilita)
200
unsigned Pop(PILA * pilita)
203
return pilita->dato[--pilita->top];
204
return pilita->dato[pilita->top];
206
/***************************/
207
PILA tamagnos;/*tamagno del ultimo caracter guardado*/
208
unsigned long i, max;
210
setvbuf(stdout, (char *) NULL, _IONBF, 0);
213
if (PilaIni(&tamagnos,max)) return NULL;/*PilaIni devuelve x!=0 si hay error*/
214
while ((ch=getch())!='\n')
216
if(i<max+2) /*¿podemog coger caracteres?*/
218
if (ch >= 32 && ch <= 126) /*caracteres alfanumericos e imprimibles "normales"*/
224
else if ((ch == -61)&&(max+2-i>=2)) /*vovales con acento o dieresis (2 bytes)*/
233
if(ch==127)/*borrar*/
235
if(!PilaVacia(tamagnos))
242
if (!ch) while(getch()!='\n'); /*Si no se lee nada, se espera a un Enter*/
246
setvbuf(stdout, (char *) NULL, _IOLBF, 0);