Necesito ayuda para poner una fecha limite o fecha final a mi programa para mi bloc de notas

Iniciado por Alex1209, 15 Diciembre 2020, 05:18 AM

0 Miembros y 1 Visitante están viendo este tema.

Alex1209


#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>

int opc;

void CrearBlocDeNotas();
void BuscarBlocDeNotasL();
void AbrirBlocDeNotasE();

//PROGRAMA PRINCIPAL
void main(){
   

do{
system("cls");
printf("                ---Menu Principal de Easy Take List---\n");
printf("1.-Crear Nuevo Bloc de Notas\n");
printf("2.-Buscar Bloc de Notas\n");
printf("3.-Abrir Bloc de Notas\n");
printf("4.-Salir\n");
printf("Eliga una opcion: ");
scanf("%d",&opc);
fflush(stdin);
switch(opc){
case 1:
CrearBlocDeNotas();
break;
case 2:
BuscarBlocDeNotasL();
break;
case 3:
AbrirBlocDeNotasE();
break;
}
}while(opc != 4);
system("cls");
}

//FUNCIONES Y PROCEDIMIENTOS
void CrearBlocDeNotas(){
char nomBloc[30];

printf("Asigna un titulo a tu nueva tarea: ");
scanf("%[^\n]",&nomBloc);
fopen(nomBloc,"w+");
printf("Tarea Creada con Exito!");
printf("Regresando al menu principal de Easy Take List...");
sleep(3);
}
void BuscarBlocDeNotasL(){
FILE * arch;

char nomBloc[30];
char cadena[100];
printf("Nombre de la tarea: ");
scanf("%[^\n]",&nomBloc);
arch = fopen(nomBloc,"r");
if(arch == NULL){printf("Error de Lectura, Verifica el nombre de la tarea y vuelve a intentarlo\n");sleep(3);}
else{
printf("Lextura Exitosa!\n");
printf("------------->Easy Take List<-------------\n");
while(feof(arch)==0){
fgets(cadena,100,arch);
printf("%s",cadena);
}
fclose(arch);
printf("----------------------------------------------------");
sleep(10);
}
}

void AbrirBlocDeNotasE(){
FILE * arch;

char nomBloc[30];
char cadena[100];

printf("Nombre de la tarea: ");
scanf("%[^\n]",&nomBloc);
arch = fopen(nomBloc,"a");
fflush(stdin);
if(arch == NULL){printf("Error de Lectura, Verifica el nombre de la tarea y vuelve a intentarlo\n");sleep(3);}
else{
printf("Lectura exitosa\n");
while(strcmp(cadena,"FIN")!=0){
printf("Ingresa los detalles de la tarea: ");
scanf("%[^\n]",&cadena);
if(strcmp(cadena,"FIN")!=0){
fputs(cadena,arch);
fputs("\n",arch);
setbuf(stdin,NULL);

}
}
fclose(arch);
}

}



MOD: El código debe ir entre ambas etiquetas de Código GeSHi


K-YreX

Tienes que concretar un poco más en lo que necesitas. No se sabe dónde o para qué tienes que agregar una fecha límite.

Aparte te eso, algunas recomendaciones:
  • No utilizar variables globales (opc). No la necesitas para nada fuera del main() y aunque así fuese, para eso existen los parámetros en las funciones: para pasar las variables entre ellas.

  • Utilizar constantes para dar un nombre a los valores que hay sueltos por el programa. Por ejemplo:

    #define SIZE_NOMBRE 30
    #define SIZE_CADENA 100
    #define SLEEP_TIME 3
    //...

    Y así puedes cambiar los valores en un único sitio (al principio del programa) y que se modifique en todos los sitios donde se usa.

  • Poner hasta 2 instrucciones en una línea se puede llegar a dar de paso si es algo muy sistemático y sencillo de ver. Mezclar 3 o más instrucciones dificulta bastante su lectura (línea 61).

  • Utilizas muchas funciones diferentes para lo mismo. Para leer cadenas de texto (char[]) utiliza siempre fgets() ya sea desde un fichero o desde la entrada estándar. Lo único que tienes que cambiar es el último argumento con el nombre del fichero o con stdin para referirte a la entrada estándar.

    char nombreBloc[SIZE_NOMBRE];
    printf("Introduce el nombre del bloc: ");
    fgets(nombreBloc, SIZE_NOMBRE, stdin);

    Si utilizas scanf(), tal y como haces, el programa fallará si introduces un número de caracteres mayor a la longitud máxima permitida. Con fgets() evitas esta situación.

  • Relacionado con lo anterior, fflush(stdin) no es una forma correcta de usar la función fflush(). Esta fue diseñada para limpiar el buffer de salida (stdout), no el de entrada (stdin). Su comportamiento no está definido. Una forma de limpiar el buffer es utilizar getchar() que coge un caracter del buffer.
    Seguido al ejemplo anterior de fgets(), si justo después incluyes estas líneas conseguirás, por una parte eliminar el salto de línea final de la cadena y por otra dejar el buffer limpio.

    fgets(nombreBloc, SIZE_NOMBRE, stdin);
    if(nombreBloc[strlen(nombreBloc) - 1] == '\n') nombreBloc[strlen(nombreBloc) - 1] = '\0'; // si el salto de linea esta al final, lo sustituyes por el fin de cadena y ya sabes que no queda nada en el buffer
    else while(getchar() != '\n'); // si queda algo en el buffer (el salto de linea o caracteres que no cabian), entonces lo limpias

    Igual que con la lectura de cadenas, no sigues un patrón claro de limpieza. A veces llamas a fflush(), otras veces no... Y luego está la función setbuf() que no sé si sabes exactamente lo que hace ya que es la primera vez que la veo en unos cuantos años.

  • feof() no debe utilizarse como condición de parada en la lectura de ficheros. Utiliza directamente el valor que devuelve fgets().

    while(fgets(cadena, SIZE_CADENA, fichero))
      printf("%s", cadena);


  • Por otro lado, en las dos últimas funciones compruebas si el fichero se ha abierto correctamente pero en la primera no. Qué pasa si no se puede crear el fichero?

  • Y en la última función, en vez de hacer la comprobación con un while() (que en la primera iteración no tienes nada en <cadena>), utiliza un do-while() que primero ejecuta el interior y después hace la comprobación.

    // Esto puede ir como constante global o dentro de la propia funcion
    const char CADENA_FIN[] = "FIN";

    char cadena[SIZE_CADENA];
    int continuar;
    do {
      printf("Introduce una cadena: ");
      fgets(cadena, SIZE_CADENA, stdin);
      // Como he dicho antes, eliminas el salto de linea y limpias el buffer
      if(cadena[strlen(cadena) - 1] == '\n') cadena[strlen(cadena) - 1] = '\0';
      else while(getchar() != '\n');
      // Ahora comparas la cadena
      continuar = (strcmp(cadena, CADENA_FIN)); // Guardara 0 (que equivale a false) si son iguales y 1 o -1 (que equivale a true por ser distinto de 0) en otro caso. Asi no haces la comparacion 2 veces
      if(continuar){
        // No veo ninguna ventaja de usar fputs() en vez de fprintf()
        fprintf(fichero, "%s\n", cadena);
      }
    } while(continuar);


    Dicho todo esto, espero que apliques los consejos aunque lo hagas a tu manera. Y especifica con más detalle el problema que tienes para poder ayudarte.


    PD: Permíteme hacer esta mención:
    Cita de: Xlajenafroxdro en 15 Diciembre 2020, 06:45 AM
    Estoy igual ojala alguien ayude
    Fíjate en la diferencia. Alex1209 ha abierto un tema con un poco de formalidad y siguiendo las normas y ha tenido más ayuda ya que si hubiese abierto x temas con títulos para nada descriptivos, sin aportar nada y solo pidiendo que le hagan la tarea. Y no ha tenido que pedir que sean serios... :silbar: :silbar:
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;