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

Leer bloc de notas. URGEE :(

Estas en el tema de Leer bloc de notas. URGEE :( en el foro de C/C++ en Foros del Web. Bueno pues hice un logg-in a mi manera y resulta que la profesora me dijo que asi no valia, que me buscase otra manera mejor, ...
  #1 (permalink)  
Antiguo 13/05/2013, 11:41
 
Fecha de Ingreso: agosto-2008
Mensajes: 382
Antigüedad: 15 años, 7 meses
Puntos: 2
Leer bloc de notas. URGEE :(

Bueno pues hice un logg-in a mi manera y resulta que la profesora me dijo que asi no valia, que me buscase otra manera mejor, el problema esque no me explicó como hacerlo de otra manera, solo tengo un breve esquema de lo que entendi que me puso, pero el programa no me funciona, unicamente recoge el primer valor entero que encuentra, si ustedes pueden ayudarme a entenderlo se lo agradezco un montón:

Código C:
Ver original
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. void comprobar( int *id);
  5.  
  6. void main()
  7. {
  8.     int id=9999; // Usar el id del loggin el id
  9.     comprobar(&id);
  10.  
  11.  
  12.     system("pause");
  13.  
  14. }
  15.  
  16. void comprobar(int *id)
  17.     {
  18.         int id1,dia1,mes1;
  19.         char nombre1[50];
  20.         FILE *rd;
  21.         rd = fopen("pacientes.txt","a+");
  22.         if(rd==NULL)
  23.         {
  24.             printf("No se puede abrir el archivo\n");
  25.             exit(1);
  26.         }
  27.  
  28.         fprintf(rd,"9999 22 5 julio");
  29.  
  30.         fscanf(rd,"%d", &id1); // Te va leyendo todos los enteros
  31.  
  32.         if(*id==id1) // Y si alguno cumple esta condicion, es que esta registrado
  33.         {
  34.             fscanf(rd,"%d %d %d %s",&id1,&dia1,&mes1,nombre1[50]); // Ahora, va leyendo datos que esten en esta disposicion: entero(espacio)entero... y cuando encuentra el valor del primer entero, te guarda el de los dos enteros y cadena siguientes.
  35.        
  36.             printf("El usuario %s esta registrado, nacido el %d del mes %d \n" ,nombre1[50], dia1, mes1);
  37.         }
  38.  
  39.         if(*id!= id1)
  40.         {
  41.             printf("El usuario no esta registrado\n");
  42.         }
  43.  
  44. }
__________________
la experiencia es la mejor de las escuelas, pero la obtienes cuando ya no la necesitas.

Yo soy aquel que mucho hace trabajar a la gente del foro, pero siempre gratifico con un karma
  #2 (permalink)  
Antiguo 13/05/2013, 13:44
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Leer bloc de notas. URGEE :(

Tal como lo tienes solo funciona cuando el archivo contiene 1 o mas entradas; me explico siguiendo tu codigo linea por linea suponiendo que el archivo 'pacientes.txt' está vacio:

Código:
rd = fopen("pacientes.txt","a+");
Ahora tienes un puntero al archivo (si existe lo abre y si no existe lo crea y abre). El modo 'a+' te permite leer y escribir teniendo en cuenta que los punteros de lectura y escritura (RW) avanzan a la vez: esto significa que ahora tienes el RW en posicion 0 ok?

Código:
fprintf(rd, "9999 22 5 julio");
Escribes 15 bytes, ahora el RW esta en posicion 15.

Código:
fscanf(rd, "%d", &id1);
Supongo que ahora ya ves donde tienes el error no? El RW sigue estando en posicion 15, es decir que cualquier lectura esta en EOF. Puedes solucionarlo resituando el puntero de lectura al principio:

Código:
fseek(rd, 0L, SEEK_SET);
fscanf(rd, "%d", &id1);
Ya tienes el 9999 en 'id1'

Saludos
vosk
  #3 (permalink)  
Antiguo 13/05/2013, 15:41
 
Fecha de Ingreso: agosto-2008
Mensajes: 382
Antigüedad: 15 años, 7 meses
Puntos: 2
Respuesta: Leer bloc de notas. URGEE :(

Ya probé a quitar lo de la escritura y buscar simplemente dentro del bloc de notas pero solo me cogia el primer int que encontraba y no pasaba a buscar mas.

¿Como hago para que recorra todos los int hasta encontrar el que busco de la manera anterior? yo lo hice de esta manera y me dijeron que la habia mucho mas facil.

Código C:
Ver original
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. void logg(int *id); //función en la que compruebo los datos introducidos por el usuario
  6. void iniciosesion(int *id,char tsanitaria[], int longitudtsanitaria);//funcion en la que, una vez introducidos correctamente, creamos el puntero *id
  7. void main(){
  8. int id;
  9. logg(&id);
  10. printf("usuario con id %d",id); //prueba sin mas
  11. system("pause");
  12. }
  13.  
  14. void logg(int *id){
  15.     char datos[10000],nacimiento[11]; //en la variable datos meto todo el archivo pacientes.txt para analizarlo
  16.     char tsanitaria[4];
  17.     int i=0,longitudtsanitaria,longitudnacimiento,j=0,x=0,contador=0,correcto=0,ok=0, prueba=0;
  18.     while(ok==0){ //este bucle se repetirá hasta que el paciente introduzca bien sus datos
  19.     int i=0,x=0,contador=0,correcto=0,j=0;
  20.     FILE *rd; //abro archivo
  21.     rd=fopen("pacientes.txt", "r");
  22.     while((datos[i]=fgetc(rd))!=EOF){ ++i; } i=0;//Aquí es donde paso toda la informacion a una variable
  23.     printf("Introduce tu tarjeta sanitaria\n");
  24.     scanf("%s",tsanitaria);
  25.     printf("Introduce tu fecha de nacimiento de la forma dd-mm-aaaa\n");
  26.     scanf("%s",nacimiento);
  27.     longitudtsanitaria= strlen(tsanitaria); //calculo la longitud para posteriores calculos
  28.     longitudnacimiento= strlen(nacimiento);
  29.     while(datos[i] != '\0'){  //Aquí comienza el bucle que va recorriendo caracter por caracter hasta encontrar coincidencias con lo introducido por el paciente
  30.    
  31.                                   if(datos[i]==tsanitaria[0]){ x=i; //Si un caracter analizado coincide con el primer caracter de la tsanitaria introducido compruebo si coincide entero
  32.                                           for(j=0;j<longitudtsanitaria;j++){ if(datos[x]==tsanitaria[j]){ contador++; if(contador==longitudtsanitaria){ correcto++;}} x++;}} contador=0;
  33.                                   if(correcto==1){
  34.                                       if(datos[i]=='\n'){ if(datos[i+1]=='\n'){ correcto=0;}}} /*Si al seguir buscando hay un doble salto de linea significa que estamos mirando en otro usuario,
  35.                                                                                                por lo menos no seria correcto introducir la tsanitaria de uno y el nacimiento de otro, por ello igualo
  36.                                                                                                correcto=0 para que no de el logg-in como correcto*/
  37.                                   if(datos[i]==nacimiento[0]){ x=i; //compruebo lo mismo pero con el nacimiento
  38.                                           for(j=0;j<longitudnacimiento;j++){ if(datos[x]==nacimiento[j]){ contador++; if(contador==longitudnacimiento){ correcto++;}} x++;}}    contador=0;                                      
  39.     i++;}
  40.     if(correcto==2){ printf("Logg-in Correcto\n"); ok=1; //Si la tsanitaria y el nacimiento coindicen sin la existencia de dobles saltos de linea correcto sera igual a 2 y por tanto el loggin se completará
  41.     iniciosesion(id, tsanitaria,longitudtsanitaria);} //aqui llamo a la función iniciar sesión para que genere el puntero y podamos operar
  42.     else{ printf("logg-in incorrecto, reintente\n\n");
  43.     }}
  44. }

mil gracias de verdad
__________________
la experiencia es la mejor de las escuelas, pero la obtienes cuando ya no la necesitas.

Yo soy aquel que mucho hace trabajar a la gente del foro, pero siempre gratifico con un karma
  #4 (permalink)  
Antiguo 13/05/2013, 18:03
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Leer bloc de notas. URGEE :(

hola!
Cita:
la profesora me dijo que asi no valia
mmm q un profesor te diga "no vale" la verdad me parece muy mal. Para mi gusto mientras un codigo funcione, esta bien; luego se puede discutir si el codigo se puede optimizar, controlar errores, etc...

Te marco algunas cosas mas del primer codigo:
- estas haciendo dos lecturas en id1, es decir:
Código vb:
Ver original
  1. fscanf(rd,"%d", &id1);
  2. if(*id==id1) // Y si alguno cumple esta condicion, es que esta registrado
  3.         {
  4. fscanf(rd,"%d %d %d %s",&id1,&dia1,&mes1,nombre1[50]);
si entra al if entonces volves a querer almacenar algo en id1, pero el cursor ya avando por lo tanto estarias leyendo mal. Ademas no tenes q poner nombre1[50] solo va nombre1

- id no hace falta q lo pases por referencia, ya q no haces ningun cambio en la funcion

- Para recorrer todo el archivo y encontrar el id deseado, solo hace falta poner todo en un bucle(comprobando q no sea fin de archivo)


En fin hace mucho no hago un programa, asi q subo las modificaciones(el archivo de texto debe estar cargado con datos):
Código C:
Ver original
  1. #include<stdio.h>
  2.     #include<stdlib.h>
  3.      
  4.     void comprobar( int *id);
  5.      
  6.     int main()
  7.     {
  8.         int id=9999; // Usar el id del loggin el id
  9.         comprobar(&id);
  10.      
  11.      
  12.      //   system("pause");
  13.      return 0;
  14.     }
  15.      
  16.     void comprobar(int *id)
  17.         {
  18.             int id1,dia1,mes1;
  19.             char nombre1[50];
  20.             FILE *rd;
  21.             rd = fopen("pacientes.txt","rt");
  22.             if(rd==NULL)
  23.             {
  24.                 printf("No se puede abrir el archivo\n");
  25.                 exit(1);
  26.             }
  27.            
  28.             fscanf(rd,"%d %d %d %s",&id1,&dia1,&mes1,nombre1);
  29.             while(!feof(rd)){
  30.                
  31.                 if(*id==id1) // Y si alguno cumple esta condicion, es que esta registrado
  32.                 {  
  33.                     printf("El usuario %s esta registrado, nacido el %d del mes %d \n" ,nombre1, dia1, mes1);
  34.                     break; /* si se encuentra el usuario entonces no hace falta q recorra TODO el arhcivo.
  35.                     Por lo tanto obligo a salir del bucle con el break */
  36.                 }
  37.                 fscanf(rd,"%d %d %d %s",&id1,&dia1,&mes1,nombre1);
  38.             }
  39.             if(*id!= id1)
  40.             {
  41.                 printf("El usuario no esta registrado\n");
  42.             }
  43.         return;
  44.     }


Saludos
  #5 (permalink)  
Antiguo 14/05/2013, 00:42
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Leer bloc de notas. URGEE :(

Cita:
Iniciado por cesar_casla Ver Mensaje
hola!
mmm q un profesor te diga "no vale" la verdad me parece muy mal. Para mi gusto mientras un codigo funcione, esta bien; luego se puede discutir si el codigo se puede optimizar, controlar errores, etc...

Un código puede funcionar pero no hacer lo que la profesora le pidió, por lo tanto no estaría bien ;)
__________________
Aviso: No se resuelven dudas por MP!
  #6 (permalink)  
Antiguo 14/05/2013, 04:11
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Leer bloc de notas. URGEE :(

Hagas lo que hagas los profesores siempre critican y lo encuentran todo mal :) A mi me tenian tirria, no es que suspendiera por no estudiar sino porque los profesores se ponian de acuerdo para catearme :))

Creo que lo mejor seria que trabajaras con structs: es mas limpio, mas facil, mas de todo.

Código:
#define MAXLEN_NAME 50

typedef struct {
	int id, dia, mes;
	char nombre[MAXLEN_NAME];
} PACIENTE;
Ahora solo tienes que leer tamaños de struct y comprovar el id, o el nombre o lo que quieras

Código:
PACIENTE current;

while(fread(&current, sizeof(PACIENTE), 1, rd) == 1) {
	if(current.id == *id) {
                //ya lo tienes
	}
}
if(ferror(rd)) {
        //error de lectura
}
Puedes enviar un puntero a una struct para que al buscar te copie los datos encontrados y lo que quieras.

Saludos
vosk
  #7 (permalink)  
Antiguo 14/05/2013, 11:54
 
Fecha de Ingreso: agosto-2008
Mensajes: 382
Antigüedad: 15 años, 7 meses
Puntos: 2
Respuesta: Leer bloc de notas. URGEE :(

cesar_casla, muchas gracias por la correción pero sigo teniendo una pega :S

El while tal y como lo pusiste se lo salta directamente, no entra en el if a menos que ponga
while(feof(rd)!=0){ el problema es que al poner eso no termina nunca de buscar :S una vez mas muchas gracias a todos
__________________
la experiencia es la mejor de las escuelas, pero la obtienes cuando ya no la necesitas.

Yo soy aquel que mucho hace trabajar a la gente del foro, pero siempre gratifico con un karma
  #8 (permalink)  
Antiguo 14/05/2013, 12:10
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Leer bloc de notas. URGEE :(

Cita:
Un código puede funcionar pero no hacer lo que la profesora le pidió, por lo tanto no estaría bien ;)
Si eso es verdad, pero yo entendi que only_skating habia echo un programa q estaba bien pero a la profesora no le gusto ¿y desde cuando se aprende a programar segun los gustos de los demas??? Al menos yo no comparto esa idea


Saludos
  #9 (permalink)  
Antiguo 14/05/2013, 12:55
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Leer bloc de notas. URGEE :(

Cita:
El while tal y como lo pusiste se lo salta directamente, no entra en el if a menos que ponga
while(feof(rd)!=0){ el problema es que al poner eso no termina nunca de buscar :S una vez mas muchas gracias a todos
mmm q raro a mi me anda, igual la condicion no puede ser esa, ya que feof solo devuelve distinto de cero cuando se alcanza el fin de archivo de lo contrario devuelve siempre cero... Mira q el archivo debe estar creado, yo probe con algo como:
2222 5 4 alberto
9999 22 5 julio
1111 14 6 leo
7894 1 1 ale


Saludos
  #10 (permalink)  
Antiguo 15/05/2013, 04:11
 
Fecha de Ingreso: agosto-2008
Mensajes: 382
Antigüedad: 15 años, 7 meses
Puntos: 2
Respuesta: Leer bloc de notas. URGEE :(

Muchas gracias de verdad solo tuve que añadir muchos contactos, como una vez recogidas ciertas variables podria modificarlas y escribirlas en el mismo sitio en el bloc de notas? espero que me entiendan, osea recoger el nombre por ejemplo y que pueda escribir uno nuevo en el mismo lugar donde tenia el antiguo. millll gracias!
__________________
la experiencia es la mejor de las escuelas, pero la obtienes cuando ya no la necesitas.

Yo soy aquel que mucho hace trabajar a la gente del foro, pero siempre gratifico con un karma

Última edición por only_skating; 15/05/2013 a las 05:05
  #11 (permalink)  
Antiguo 15/05/2013, 05:43
 
Fecha de Ingreso: agosto-2008
Mensajes: 382
Antigüedad: 15 años, 7 meses
Puntos: 2
borrar o cambiar en bloc de notas

Una vez mas me mandaron hacer algo que no sé hacer con fscanfs sino cargando todo el bloc de notas a una variable y tirando de bucles y sentencias de control. Hay alguna manera de hacerlo mas "facilmente". osea, leer una linea con un scanf, modificar una variable e imprimirla en el mismo lugar donde estaba, o al menos, poder borrarla=? milllll gracias
__________________
la experiencia es la mejor de las escuelas, pero la obtienes cuando ya no la necesitas.

Yo soy aquel que mucho hace trabajar a la gente del foro, pero siempre gratifico con un karma
  #12 (permalink)  
Antiguo 15/05/2013, 10:44
 
Fecha de Ingreso: agosto-2008
Mensajes: 382
Antigüedad: 15 años, 7 meses
Puntos: 2
Respuesta: Leer bloc de notas. URGEE :(

he conseguido apañarmelas utilizando un bloc de notas auxiliar en el que guardo los datos de todos los usuarios menos el que deseo eliminar y del auxiliar lo repego en el bueno. gracias a todos! un saludo
__________________
la experiencia es la mejor de las escuelas, pero la obtienes cuando ya no la necesitas.

Yo soy aquel que mucho hace trabajar a la gente del foro, pero siempre gratifico con un karma

Etiquetas: funcion, int, notas, programa, usuario, variable
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 13:50.