Ayuda con agenda

cosoth
09 de Julio del 2009
Necesito saber porque al momento de listar aparece un bucle que no me permite salir del programa y por que no modifica mi agenda, aqui les paso el codigo:
[CODE]1.#include <stdio.h>
2.#include <conio.h>
3.#include <string.h>
4.#include <stdlib.h>
5.
6.typedef struct {
7. char nom[20];
8. char apep[20];
9. char apem[20];
10. char tel[10];
11. char dir[35];
12. char email[30];
13.}Amigo;
14.
15./*Funciones de Archivo*/
16.void Crear(void);
17.void Listar(void);
18.void Agregar(void);
19.void Modificar(void);
20.void Borrar(void);
21.void Encontrar(void);
22.
23./*Nombre del Archivo a guardar*/
24.char hans[] = "agenda.dat";
25.
26.FILE *archivo2(char cadena[], int metodo);
27.
28.void main(){
29. FILE *mechita;
30. int opc;
31. char cad[5];
32.
33. mechita = archivo2(hans,0);
34. if( mechita ){
35. fclose(mechita);
36. }
37. else
38. {
39. printf("Error: No se pudo abrir el archivon");
40. puts("Presiona cualquier tecla para continuar... y Crear el Archivon");
41. mechita = archivo2(hans,1);
42. fclose(mechita);
43. getch();
44. }
45.
46. do{
47. clrscr();
48. printf("ttProyecto Final de Fundamentos de Programacionn");
49. printf("ttttAgenda de Amigosn");
50. printf("ttttHans Cosar - Kathy Rojasn");
51. printf("tt*******************************************n");
52. printf("MENUnn");
53. puts("1. Crear Archivon");
54. puts("2. Agregarn");
55. puts("3. Eliminarn");
56. puts("4. Listarn");
57. puts("5. Buscarn");
58. puts("6. Modificarn");
59. puts("7. Salirn");
60. puts("Opcion: ");
61. opc = atoi(gets(cad));
62. while(opc<0 || opc>7) /*Limitando la entrada de las opciones*/
63. opc = atoi(gets(cad)); //atoi Convierte a una representacion de int
64. clrscr();
65. switch(opc)
66. {
67. case 1:
68. Crear();
69. break;
70. case 2:
71. Agregar();
72. break;
73. case 3:
74. Borrar();
75. break;
76. case 4:
77. Listar();
78. break;
79. case 5:
80. Encontrar();
81. break;
82. case 6:
83. Modificar();
84. break;
85. }
86.
87. /*Solo parar cuando sea una de las opciones*/
88. if(opc<7){
89. puts("Presiona Cualquier Tecla para ir al Menu Principaln");
90. getch();
91. }
92.
93.
94. }while(opc!=7);
95.
96.}
97.
98.
99.
100.// FUNCION PARA CREAR UN ARCHIVO
101./*****************************************************************
102.Funcion que sirve para borrar todo el Contenido del Archivo Binario*/
103.void Crear(void){
104. FILE *mechita;
105.
106. mechita = archivo2(hans,0);
107. if(mechita)
108. {
109. printf("Error al abrir: agenda.datn");
110. fclose(mechita);
111. }
112.}
113.
114.
115./********************************************************
116.Funcion que sirve para imprimir todos los un registros del Archivo Binario*/
117.void Listar(void){
118. FILE *mechita;
119. int i=1;
120. Amigo aux;
121. mechita = archivo2(hans,0);
122. if(!(mechita))
123. printf("Error de apuertura del archivo agenda.dat");
124. else{
125. printf("***** LISTA DE AMIGOS *****nn");
126. while ((fread(&aux, sizeof(aux), 1, mechita))!=0){
127. printf("---------------------------------------------------------------n");
128. printf("DATOS DEL AMIGO # %dn",i);
129. printf("Nombre: %sn",aux.nom);
130. printf("Apellido Paterno: %sn",aux.apep);
131. printf("Apellido Materno: %sn",aux.apem);
132. printf("Telefono: %sn",aux.tel);
133. printf("Direccion: %sn",aux.dir);
134. printf("Email: %sn",aux.email);
135. i++;
136.getch();
137. }
138. printf("---------------------------------------------------------------n");
139. fclose(mechita);
140. }
141.}
142.
143./********************************************************
144.Funcion que sirve para agregar un registro dentro del Archivo Binario*/
145.void Agregar(void){
146. FILE *mechita;
147. Amigo aux;
148. char cad[3];
149.
150. printf("***** INGRESAR NUEVO AMIGO ******nn");
151. mechita=archivo2(hans,2);
152. if(!(mechita))
153. printf("No se puede abrir el archivo agenda.dat");
154. else{
155. /*Introduciendo los Datos del Amigo*/
156. printf("Nombre: n");
157. gets(aux.nom);
158. printf("Apellido Paterno: n");
159. gets(aux.apep);
160. printf("Apellido Materno: n");
161. gets(aux.apem);
162. printf("Telefono: n");
163. gets(aux.tel);
164. printf("Direccion: n");
165. gets(aux.dir);
166. printf("Email: n");
167. gets(aux.email);
168.
169. fwrite(&aux, sizeof(aux), 1, mechita);
170. printf("---------------------------------------------------------------n");
171. fclose(mechita);
172. }
173.}
174.
175.
176./********************************************************
177.Funcion que sirve para Modificar un registro dentro del Archivo Binario*/
178.void Modificar(void){
179. FILE *mechita;
180. Amigo aux;
181. int n;
182. char cadena[25],cad[2];
183. mechita=archivo2(hans,3);
184. if(!(mechita))
185. printf("Error de apuertura del archivo agenda.dat");
186. else{
187. printf("Ingrese el Nombre del amigo a modificar: n");
188. gets(cadena);
189.
190. /*Buscando el Amigo dentro del Archivo*/
191. while ((n=fread(&aux, sizeof(aux), 1, mechita))!=0 && stricmp(aux.nom,cadena)!=0);
192. if (n==0)
193. printf("No se encuentra a: %s n",cadena);
194. else{
195. printf("--------------n");
196. printf("Nombre: %s n",aux.nom);
197. printf("Apellido Paterno: %s n",aux.apep);
198. printf("Apellido Materno: %s n",aux.apem);
199. printf("Telefono: %s n",aux.tel);
200. printf("Direccion: %s n",aux.dir);
201. printf("Email: %s n",aux.email);
202. printf("--------------nn");
203. printf("***** Modificando *****n");
204. printf("Ingrese Nuevo Nombre: n");
205. gets(aux.nom);
206. printf("Ingrese Nuevo Apellido Paterno: n");
207. gets(aux.apep);
208. printf("Ingrese Nuevo Apellido Materno: n");
209. gets(aux.apem);
210. printf("Ingrese Nuevo Telefono: n");
211. gets(aux.tel);
212. printf("Ingrese Nueva Direccion: n");
213. gets(aux.dir);
214. printf("Ingrese Nuevo Email: n");
215. gets(aux.email);
216. printf("--------------nn");
217. printf("Guardado Exitosamente!!!n");
218. fseek(mechita,-1*sizeof(aux),SEEK_CUR);
219. fwrite(&aux, sizeof(aux), 1, mechita);
220. }
221. printf("---------------------------------------------------------------n");
222. fclose(mechita); //Cerramos el archivo
223. }
224.}
225.
226./********************************************************
227.Funcion que sirve para borrar un registro dentro del Archivo Binario*/
228.void Borrar(void){
229. FILE *mechita,*fd;
230. Amigo aux;
231. int encontrado=0;
232. char cadena[25];
233.
234. printf("Introduce el nombre del Amigo a borrar: ");
235. gets(cadena);
236.
237. printf("Borrando Registrosn");
238. mechita=archivo2(hans,0);
239. if(!(mechita))
240. printf("Error de apuertura del archivo agenda.dat");
241. else{
242. fd=archivo2("paso.$$$",1);
243. if(!(fd))
244. printf("Error Imposible crear archivo auxiliar");
245. else{
246. while ((fread(&aux, sizeof(aux), 1, mechita))!=0)
247. if(stricmp(aux.nom,cadena)!=0)
248. fwrite(&aux, sizeof(aux), 1, fd);
249. else
250. encontrado=1;
251. fclose(fd);
252. }
253. printf("---------------------------------------------------------------n");
254. fclose(mechita);
255. if(encontrado){
256. system("del agenda.dat");
257. system("ren paso.$$$ agenda.dat");
258. printf("Borrado Exitosamenten");
259. }
260. else{
261. system("del paso.$$$");
262. printf("No se encontro en el registro, fallo en la operacionn");
263. }
264. }
265.}
266.
267./******************************************
268.Funcion para Encontrar un Amigo e imprimir sus datos*/
269.void Encontrar(void){
270. FILE *mechita;
271. Amigo aux;
272. int n;
273. char cadena[25];
274.
275. printf("Introduce el nombre del Amigo que buscas: ");
276. gets(cadena);
277. mechita=archivo2(hans,0);
278. if(!(mechita))
279. printf("No se puede abrir el archivo agenda.datn");
280. else{
281. while ((n=fread(&aux, sizeof(aux), 1, mechita))!=0 && stricmp(aux.nom,cadena)!=0);
282. if (n==0)
283. printf("No se encuentra a: %s n",cadena);
284. else{
285. printf("DATOS:n");
286. printf("Nombres: %sn",aux.nom);
287. printf("Apellido Paterno: %sn",aux.apep);
288. printf("Apellido Materno: %sn",aux.apem);
289. printf("Telefono: %sn",aux.tel);
290. printf("Direccion: %sn",aux.dir);
291. printf("Email: %sn",aux.email);
292. /* getch();*/
293.
294. }
295. }
296. printf("---------------------------------------------------------------n");
297.
298.}
299.
300./*************************************************
301.Funcion que Carga el Archivo y regresa un apuntador con que se va a manejar el Archivo
302.Recibe: El nombre del Archivo , Y el método con que se va abrir el Archivo
303. Un Apuntador tipo Archivo, 0 - Solo Lectura , 1 - Para crearlo de nuevo desde cero,
304. 2 - Anadir Informacion, 3 - para Lectura y Escritura.
305. Regresa: El apuntador de Tipo FILE, con el cual se abrio*/
306.FILE *archivo2(char cadena[], int metodo){
307. FILE *x;
308. switch(metodo){
309. case 0:
310. x = fopen(cadena,"rb");
311. break;
312. case 1:
313. x = fopen(cadena,"wb");
314. break;
315. case 2:
316. x = fopen(cadena,"ab");
317. break;
318. case 3:
319. x = fopen(cadena,"r+b");
320. break;
321. }
322. return x;
323.}[/CODE]