Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con fwrite

Estas en el tema de Problema con fwrite en el foro de C/C++ en Foros del Web. Para no abrir dos posts, os pregunto dos cosas: La primera, tengo un fwrite que no me funciona: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original main ...
  #1 (permalink)  
Antiguo 28/05/2012, 03:05
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 15 años, 11 meses
Puntos: 0
Problema con fwrite

Para no abrir dos posts, os pregunto dos cosas:

La primera, tengo un fwrite que no me funciona:

Código C:
Ver original
  1. main()
  2. {
  3. FILE *pf;
  4.  
  5. struct ficha{
  6. int clave;
  7. char nombre[50];
  8. float nota;};
  9.  
  10. int i=0, j=0, n=0;
  11.  
  12. struct ficha registro; //Crea una estructura del tipo ficha llamada registro
  13.  
  14. if (pf = (fopen("registro.txt", "w+") == NULL)){puts("Error al abrir el ficherro");} //Abre el fichero <<registro.txt>>, donde grabaremos los datos
  15.  
  16. puts("¿Que desea hacer?");
  17. puts("A -> Añadir");
  18. puts("L -> Listar");
  19. puts("X -> Salir");
  20. /*******************************AÑADIR DATOS*******************************/
  21. if(getchar() == 'A')
  22. {
  23. puts("Cuantos registros quieres introducir?: ");
  24. scanf("%d", &n);
  25.  
  26. for(j=0; j<n; j++){
  27. puts("Introduzca los datos del alumno");
  28. puts("Clave: ");
  29. scanf("%d", &registro.clave);
  30.  
  31. puts("Nota: ");
  32. scanf("%f", &registro.nota);
  33.  
  34. puts("Nombre: ");
  35. fgets(registro.nombre, 50, stdin);
  36. //gets(registro.nombre);
  37.  
  38. if(fwrite(&registro, sizeof(registro), 1, pf) != 1) perror("escribiendo el fichero");
  39.  
  40. }}
  41. return 0;
  42. }

Ahora mismo me da violación de segmento, pero en otros momentos, cuando no me daba violación de segmento, me escribía en el fichero 0s y 1s.

El caso es que me suena que violación de segmento es cuando un puntero apunta a donde no debe, pero en este caso no tengo ni idea. Y lo de los 0s y 1s ya no lo sé.

La otra pregunta es, los que programais en linux, ¿cómo depurais?
  #2 (permalink)  
Antiguo 28/05/2012, 05:25
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Problema con fwrite

Proba con esto en el if
if ((pf = fopen("registro.txt", "w+") == NULL)

Y otra cosa no esperes que se pueda observar lo que escribiste en el archivo. Ademas tenes que abrir el archivo como binario si queres escribir estructuras.

Saludos,

PD: Yo programo en linux y no uso depuradores...depuro a ojo o voy agregandos printf para ir viendo los datos...
  #3 (permalink)  
Antiguo 29/05/2012, 04:55
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Problema con fwrite

Gracias Sam! No sé muy bien si era eso o no por que lo solucioné ayer y recién acabo de mirarlo, pero puede ser. Cambié eso entre otras cosas.

Respecto a lo de depuración... ¿No te resulta muy tedioso tener que poner printf's? Yo es que estoy acostumbrado a seguir las variables con un depurador, con el Visual C++, y ahora que me he unido a linux me encuentro desamparado jajaja

Por cierto, pongo el programa arreglado por si alguno tiene curiosidad:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. main()
  5. {
  6. FILE *pf;
  7.  
  8. struct ficha{
  9. int clave;
  10. char nombre[50];
  11. float nota;};
  12.  
  13. int i=0, j=0, n=0;
  14. char c;
  15. struct ficha registro; /*Crea una estructura del tipo ficha llamada registro*/
  16.  
  17. if ((pf = fopen("registro.txt", "a+")) == NULL)
  18. {puts("Error al abrir el fichero");} /*Abre el fichero <<registro.txt>>, donde grabaremos los datos*/
  19.  
  20. puts("¿Que desea hacer?");
  21. puts("A -> Añadir");
  22. puts("L -> Listar");
  23. c=getchar();
  24. /*******************************AÑADIR DATOS*******************************/
  25. if(c == 'A')
  26. {
  27. puts("Cuantos registros quieres introducir?: "); /*Pide tantos registros como se quieran introducir*/
  28. scanf("%d", &n);
  29.  
  30. for(j=0; j<n; j++){ /*El bucle pide una tanda de datos, los guarda en registro (struct ficha) y los graba en el fichero*/
  31. puts("Introduzca los datos del alumno");
  32. puts("Clave: ");
  33. scanf("%d", &registro.clave);
  34.  
  35. puts("Nota: ");
  36. scanf("%f", &registro.nota);
  37.  
  38. puts("Nombre: ");
  39. gets(registro.nombre);
  40.  
  41. if(fwrite(&registro, sizeof(registro), 1, pf) != 1) perror("escribiendo el fichero"); /*Graba los datos en el fichero*/
  42.  
  43. }
  44. exit(1);}
  45.  
  46. /*******************************LEER DATOS*******************************/
  47. if(c == 'L'){
  48. fseek(pf, i*sizeof(registro), 0); /*Desplaza el puntero de L/E al inicio del fichero*/
  49. fread(&registro, sizeof(registro), 1, pf); /*Concepto de "lectura adelantada". Guarda la primera estructura en registro (struct ficha)*/
  50.  
  51. while(!feof(pf)){ /*Hasta que no llegue a la marca de fin de fichero no cesa el bucle*/
  52. i++;
  53. printf("\nNOMBRE: %s, CLAVE: %d, NOTA: %0.2f \n", registro.nombre, registro.clave, registro.nota); /*Imprime por pantalla los datos de registro*/
  54. fseek(pf, i*sizeof(registro), 0); /*Avanza el cursor L/E a la siguiente estructura*/
  55. fread(&registro, sizeof(registro), 1, pf); /*Lee dichos datos y, sobrescribiendo, los guarda en registro*/
  56. }
  57. puts("\n");
  58.  
  59. exit(1);}
  60.  
  61. return 0;
  62. }
  #4 (permalink)  
Antiguo 29/05/2012, 05:18
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Problema con fwrite

Si pero no...me acostumbre a no usar esa herramienta. Igualmente existe una con linux pero nunca la investigue. Y no tiene las misma facilidades que Visual C++.
  #5 (permalink)  
Antiguo 29/05/2012, 06:03
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Problema con fwrite

Imagino... supongo que también yo habré de acostumbrarme

¿Hay alguna forma de limpiar la pantalla en linux? He pensado en la sentencia system("clear"), pero como ya sabes es muy pesada y no sé si existe alguna más liviana.

Igual, otra cosa, y esto ya es una duda conceptual: Cuando compilo con el gcc me crea un fichero a.out, que posteriormente ejecuto con el comando ./a.out. Ahora, la pregunta es, ¿qué tipo de fichero es ese? ¿Sería el equivalente en Windows al .exe? En cuyo caso, no me deja ejecutarlo con el típico "doble click". Y, en el caso de que no séa un ejecutable como tal, ¿cómo puedo obtener el ejecutable?

Es que esto de ser nuevo en algo es complejo... llevo años con Windows, y al cambiarme, a uno le surgen lagunillas
  #6 (permalink)  
Antiguo 29/05/2012, 06:30
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Problema con fwrite

el archivo a.out es efectivamente un ejecutable. Le puedes decir al gcc que le ponga otro nombre con la opcion -o.

gcc file.c -o file

En linux las extensiones casi no se tienen en cuenta. Ademas se utiliza muchisimo mas la consola. Para este tipo de aplicaciones lo mejor es ejecutarlos en la consola...sino deberias configurar tu entorno visual para que te los ejecutes.

Por otro lado en linux hay un limpiar pantalla pero no recuerdo su nombre....clrscr algo asi era.

Igualmente no es lo mejor del mundo. Si en verdad quieres hacer esas aplicaciones interactivas de consola deberias usar un entorno para la consola como ncurses, este te permite escribir en culaquier parte de la consola y borrar entre otras cosas. Y lo bueno es que es compatible con muchos tipos de consolas. Creo que tanto en windows como en linux.
En definitiva, lo bueno es que es portable.

Bueno, creo que hable demasiado ya...Nos vemos
  #7 (permalink)  
Antiguo 29/05/2012, 07:43
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Problema con fwrite

Qué bueno! No conocía el Ncurses... pero lo miraré sin falta. Tiene buena pinta. ¡Gracias! ^_^

Etiquetas: funcion, fwrite, int, programa, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:55.