elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con fprintf y fgets [Solucionado]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con fprintf y fgets [Solucionado]  (Leído 3,713 veces)
Luchoz95

Desconectado Desconectado

Mensajes: 58


Ver Perfil
Ayuda con fprintf y fgets [Solucionado]
« en: 21 Abril 2013, 06:21 am »

Gente sigo con problemas similares al anterior tema que publique , miren este codigo
es un directorio de telefono que estoy probando ...

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include<string.h>
  4.  
  5. #define MAX_CHARS 256
  6.  
  7.  
  8.  
  9. typedef struct persona
  10. {
  11. char nombre[MAX_CHARS],apellido[MAX_CHARS],telefono[20];
  12. }sPersona;
  13.  
  14. void Agregar_Presona();
  15. void Imprimir_Persona();
  16. FILE* miarchivo;
  17. char* nombrearchivo= "Directorio.txt";
  18.  
  19.  
  20.  
  21. int main()
  22. {
  23. int a,opc;
  24. while(1)
  25. {
  26. system("cls");
  27. printf("1. Agregar Persona\n");
  28. printf("2. Ver personas\n");
  29. printf("3. Salir\n\n");
  30. printf("Elige una opcion y precione enter : ");
  31. scanf("%d",&opc);
  32. switch(opc)
  33. {
  34. case 1:
  35. {
  36. Agregar_Presona();
  37. break;
  38. }
  39. case 2:
  40. {
  41. Imprimir_Persona();
  42. break;
  43. }
  44. case 3:
  45. {
  46. ExitProcess(1);
  47. }
  48. default :
  49. {
  50. MessageBox(NULL,"Opcion Incorrecta","Directorio",MB_OK | MB_ICONERROR);
  51. }
  52. }
  53. }
  54. }
  55.  
  56.  
  57. void Agregar_Presona()
  58. {
  59. sPersona nPersona;
  60. char *p;
  61. miarchivo= fopen(nombrearchivo,"a"); //abro el archivo "a" sirve para agregar al final
  62.    if(miarchivo==NULL)return -1;
  63.  
  64. system("cls");
  65. fflush(stdin);
  66.  
  67. printf("Introduce el nombre del persona: ");
  68. fflush(stdin);
  69. fgets(nPersona.nombre, MAX_CHARS, stdin);
  70. //Elimina el avance de linea ... Gracias rir3760 !
  71. p = strchr(nPersona.nombre, '\n');
  72. if (p != NULL)
  73. *p = '\0';
  74.  
  75.  
  76.  
  77. printf("Introduce el apellido de la persona: ");
  78. fflush(stdin);
  79. fgets(nPersona.apellido, MAX_CHARS, stdin);
  80. //Elimina el avance de linea ... Gracias rir3760 !
  81. p = strchr(nPersona.apellido, '\n');
  82. if (p != NULL)
  83.      *p = '\0';
  84.  
  85.  
  86.  
  87. printf("introduzca el telefono: ");
  88. fflush(stdin);
  89. fgets(nPersona.telefono, 20, stdin);
  90.  
  91. //Elimina el avance de linea ... Gracias rir3760 !
  92. p = strchr(nPersona.telefono, '\n');
  93. if (p != NULL)
  94.       *p = '\0';
  95.  
  96.  
  97. nPersona.nombre[0]=toupper(nPersona.nombre[0]); //Funcion que convierte la primera letra de la palabara en mayuscula
  98. nPersona.apellido[0]=toupper(nPersona.apellido[0]); //Funcion que convierte la primera letra de la palabara en mayuscula
  99.  
  100.  
  101.  
  102. fprintf(miarchivo,"%-20s\t%-20s\t%-20s\n",nPersona.nombre,nPersona.apellido,nPersona.telefono);
  103.  
  104.    fclose(miarchivo);
  105.  
  106.  
  107. }
  108.  
  109.  
  110.  
  111. void Imprimir_Persona()
  112. {
  113. char cadena[MAX_CHARS];
  114. //char* cpToken;
  115.    miarchivo= fopen(nombrearchivo,"r");
  116.    if(miarchivo==NULL)return -1;
  117.    system("cls");
  118.    while(!feof(miarchivo))
  119. {
  120. fgets(cadena,MAX_CHARS,miarchivo);
  121. fputs(cadena,stdout);
  122. }
  123. printf("Presione una tecla para volver al menu ...");
  124. system("pause>nul");
  125.  
  126.  
  127.    fclose(miarchivo);
  128. }
  129.  

el problema esta que cuando se lee el archivo se lee tambien el ultimo '\n' y pasa lo siguiente ...

como vemos se repite la ultima linea ... algun consejo ? S2!


« Última modificación: 21 Abril 2013, 07:06 am por Luchoz95 » En línea

Luchoz95

Desconectado Desconectado

Mensajes: 58


Ver Perfil
Re: Ayuda con fprintf y fgets
« Respuesta #1 en: 21 Abril 2013, 07:05 am »

Lo solucionee gente !! hice lo siguiente
Código
  1. void Imprimir_Persona()
  2. {
  3. char cadena[MAX_CHARS];
  4.    miarchivo= fopen(nombrearchivo,"r");
  5.    if(miarchivo==NULL)return -1;
  6.    system("cls");
  7. fgets(cadena,MAX_CHARS,miarchivo);
  8.    while(!feof(miarchivo))
  9. {
  10. fputs(cadena,stdout);
  11. fgets(cadena,MAX_CHARS,miarchivo);
  12. }
  13. printf("\nPresione una tecla para volver al menu ...");
  14. system("pause>nul");
  15.  
  16.  
  17.    fclose(miarchivo);
  18. }

S2!


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ayuda con fprintf y fgets [Solucionado]
« Respuesta #2 en: 21 Abril 2013, 07:13 am »

En esa función no puedes retornar -1 ya que ella no retorna un valor (indicado mediante su tipo de retorno: void). Cambia la sentencia de retorno a:
Código
  1. if (miarchivo == NULL)
  2.   return;

Y no necesitas utilizar la función feof (salvo ciertas excepciones es mejor evitar su uso) en su lugar se puede utilizar el valor de retorno de la función utilizada. En tu caso cambia esta parte:
Código
  1. fgets(cadena, MAX_CHARS, miarchivo);
  2. while (!feof(miarchivo)){
  3.   fputs(cadena,stdout);
  4.   fgets(cadena,MAX_CHARS,miarchivo);
  5. }
Por esta:
Código
  1. while (fgets(cadena, MAX_CHARS, miarchivo) != NULL)
  2.   fputs(cadena, stdout);

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Luchoz95

Desconectado Desconectado

Mensajes: 58


Ver Perfil
Re: Ayuda con fprintf y fgets [Solucionado]
« Respuesta #3 en: 21 Abril 2013, 07:53 am »

Muchas gracias por el consejo rir3760 como siempre, pero hay algo que no entiendo, supongamos que en el archivo de texto tenemos esto ...


Citar
Nombre1          Apellido1          Telefono1
Nombre2          Apellido2          Telefono2         
\n       (Invisible)

Porque utilizando esto :
Código
  1. while (fgets(cadena, MAX_CHARS, miarchivo) != NULL)
  2.   fputs(cadena, stdout);

no se imprime el \n ?
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ayuda con fprintf y fgets [Solucionado]
« Respuesta #4 en: 21 Abril 2013, 17:31 pm »

Porque utilizando esto :
Código
  1. while (fgets(cadena, MAX_CHARS, miarchivo) != NULL)
  2.   fputs(cadena, stdout);

no se imprime el \n ?
Para explicar esto lo mejor es dividirlo en dos partes, el contenido del archivo y como opera la función feof.

1) En C un archivo de texto (mas bien un stream en modo texto) consiste de cero o mas lineas seguidas de ... nada. Por ejemplo:
Código:
Nombre1          Apellido1          Telefono1\n
Nombre2          Apellido2          Telefono2\n       
(nada)
El archivo se procesa carácter por carácter o (como es tu caso) por linea. Eventualmente se procesan todos los caracteres y, al no haber nada mas, se activa el estado de fin de archivo o eof.

2) El porque la ultima linea se procesa dos veces se debe al uso de feof, una explicación en detalle se encuentra en el tema Re: exec y sus derivadas.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Ayuda con fprintf y fgets [Solucionado]
« Respuesta #5 en: 21 Abril 2013, 17:31 pm »

Puede que sea porque el archivo no reconoce ese tipo de caracteres, no estoy seguro, pero talvez puede ser porque reconoce ese caracter como null y entienda como el final del archivo.

de todas maneras, porque no simplemente colocas los saltos de linea en la linea de salida del menú

Código
  1. printf("\n\nPresione una tecla para volver al menu ...");
  2.  

Y se me hizo curioso ver, me hizo recordar mis clases con batch, ingenioso.
Código
  1. system("pause>nul");
  2.  

En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
fprintf funciona en dev pero no en visual c++ 2008
Programación C/C++
river_0119 1 1,564 Último mensaje 4 Mayo 2010, 05:09 am
por Littlehorse
Dudas con estructura While y con fgets [Solucionado]
Programación C/C++
Søra 0 1,539 Último mensaje 22 Mayo 2010, 12:42 pm
por Søra
fprintf y fputs
Programación C/C++
Gr1nD3r 2 3,963 Último mensaje 16 Julio 2010, 19:57 pm
por nicolas_cof
funcion fprintf
Programación C/C++
flony 2 1,895 Último mensaje 19 Enero 2013, 02:57 am
por flony
Ayuda con fprintf
Programación C/C++
Luchoz95 8 2,800 Último mensaje 20 Abril 2013, 07:01 am
por Luchoz95
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines