Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: alejandro_gsw en 6 Abril 2016, 14:00 pm



Título: Problema al utilizar archivos en C
Publicado por: alejandro_gsw en 6 Abril 2016, 14:00 pm
Hola buenas,
Soy nuevo en el foro y tenía un problemilla con un programa.
Tengo dos archivos, el primero donde esta el main y el otro donde tengo el archivo con el texto que me tiene que leer, en este caso son DNI. El problema viene cuando quieres meter el DNI y no te reconoce lo que hay dentro del archivo, además quiero que cuando meta el DNI si no está en el texto del archivo DNIList.txt que lo añada. Os dejo por aquí el código a ver si podéis ver algo que este mal o si me podéis echar un cable  ;D.
También podéis ver que  para que lleve a abrir el archivo DNIList se comprueba que el DNI tenga un formato correcto.

Citar
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAXID 16 /* Per fer-ho interessant, s’ha ampliat a 16. JAJAJAJA que majos */
  4. #define IDLEN 9
  5. char IDtable[MAXID][IDLEN+1]; /* Conté la llista d’autoritzats. */
  6. int IDtableLen; /* Quantitat de números d’identitat a IDtable. */
  7.  
  8. int IDtableLoad( char DNI[] )
  9. {
  10. FILE *fptr;
  11. char mot[BUFSIZ];
  12. int i;
  13. fptr = fopen( "DNIList.txt", "rt" );
  14. if( fptr != NULL ) {
  15. i = 0;
  16. fscanf( fptr, " %s", mot );
  17. while( !feof( fptr ) ) {
  18. //if() {
  19. //i = crida a la funció de guardar-lo a la taula;
  20. //} /* if */
  21. fscanf( fptr, " %s", mot );
  22. } /* while */
  23. fclose( fptr );
  24. } else {
  25. i = -1;
  26. } /* if */
  27. return i;
  28. } /* IDtableLoad */
  29.  
  30. char DNI[10];
  31. int validacioDNI (char DNI[10]);
  32. int DNInum;
  33.  
  34. int res = 0;
  35.  
  36. validacioDNI (char DNI[10])
  37.  
  38. {
  39.  
  40. char restalletra[23];
  41. int fin = 0;
  42. int digit;
  43. int lletra;
  44. int i = 0;
  45. int resta;
  46. int validacio = 0;
  47. int DNIincomplet = 0;
  48.  
  49.  
  50.  
  51.        if (DNI[9] != '\0')
  52.        {
  53.  
  54.          printf ("Tamany incorrecte");
  55.          validacio = 1;
  56.  
  57.                };
  58. while (i < 9 && DNIincomplet == 0)
  59. {
  60.    if (DNI[i] == NULL)
  61.    {
  62.        DNIincomplet = 1;
  63.          printf ("Tamany incorrecte");
  64.          validacio = 1;
  65.    }
  66.  i = i +1;
  67. };
  68.  
  69. i = 0;
  70.  while ( i <8 && digit != 0 )
  71.  {
  72.      digit = isdigit( DNI[i] );
  73.      i = i+1;
  74.  
  75.  
  76.  
  77.  };
  78.    if (digit == 0 && validacio == 0)
  79.      {
  80.          validacio = 1;
  81.  
  82.  
  83.      };
  84.  
  85.      lletra = isalpha( DNI[8] );
  86.      if (lletra == 0 && validacio == 0)
  87.      {
  88.  
  89.          validacio = 1;
  90.      };
  91.  
  92. DNInum = ((DNI [0] - '0')*10000000) +((DNI [1] - '0')*1000000) +((DNI [2] - '0')*100000) +((DNI [3] - '0')*10000) +((DNI [4] - '0')*1000) +((DNI [5] - '0')*100)
  93. + ((DNI [6] - '0')*10) + ((DNI [7] - '0'));
  94.  
  95.  
  96. restalletra[0] = 'T';
  97. restalletra[1] = 'R';
  98. restalletra[2] = 'W';
  99. restalletra[3] = 'A';
  100. restalletra[4] = 'G';
  101. restalletra[5] = 'M';
  102. restalletra[6] = 'Y';
  103. restalletra[7] = 'F';
  104. restalletra[8] = 'P';
  105. restalletra[9] = 'D';
  106. restalletra[10] = 'X';
  107. restalletra[11] = 'B';
  108. restalletra[12] = 'N';
  109. restalletra[13] = 'J';
  110. restalletra[14] = 'Z';
  111. restalletra[15] = 'S';
  112. restalletra[16] = 'Q';
  113. restalletra[17] = 'V';
  114. restalletra[18] = 'H';
  115. restalletra[19] = 'L';
  116. restalletra[20] = 'C';
  117. restalletra[21] = 'K';
  118. restalletra[22] = 'E';
  119.  
  120. resta = DNInum % 23;
  121.  
  122. if (validacio == 0){
  123. if (restalletra[resta] != DNI[8]  )
  124. {
  125.    validacio = 1;
  126.    printf ("Lletra incorrecte");
  127. };
  128. };
  129. i= 0;
  130.  
  131. return validacio;
  132. };
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140. int main()
  141. {
  142.    printf ("Introdueix DNI:  ");
  143.    scanf ("%s", &DNI);
  144.    res = validacioDNI (DNI);
  145.  
  146. if (res == 0)
  147. {
  148.    printf ("\nDNI correcte, ara obrirem el fitxer amb la base de dades \n");
  149.    //Aqui mandariamos algo a la primera funcion
  150.    res=IDtableLoad(DNI);
  151.    if(res==-1){
  152.        printf("El DNI no es al fitxer.");
  153.    }else{
  154.        printf("El DNI es al fitxer");
  155.    }
  156. };
  157.  
  158. if (res == 1)
  159. {
  160.    printf ("\nDNI incorrecte");
  161. };
  162.  
  163.  
  164.  
  165.    return 0;
  166. }
  167.  


Y este es el fichero DNIList (Los DNI son inventados  :rolleyes:)

Citar
94025635W
84220350P
40103636P
Z0893943F
65292343N
42972192G
X7942365M
Y9872602G
11622852D
71438118A
Y0884005Z
X0652947T
24901532F
19910859N
67501492B
50482351L

Muchísimas gracias  :D


Título: Re: Problema al utilizar archivos en C
Publicado por: AlbertoBSD en 6 Abril 2016, 14:40 pm
buen dia.

veo que lee el archivo pero no veo que cargue contenido en la memoria.

Usa El Code=c para poner tu codigo. Ya que es dificil leerlo asi


Título: Re: Problema al utilizar archivos en C
Publicado por: alejandro_gsw en 6 Abril 2016, 17:13 pm
¡Editado!
Como se puede cargar un archivo en la memoria, ahora mismo no caigo  ;D


Título: Re: Problema al utilizar archivos en C
Publicado por: AlbertoBSD en 6 Abril 2016, 17:28 pm
Código
  1. int IDtableLoad( char DNI[] )
  2. {
  3. FILE *fptr;
  4. char mot[BUFSIZ];
  5. int i;
  6. fptr = fopen( "DNIList.txt", "rt" );
  7. if( fptr != NULL ) {
  8. i = 0;
  9. fscanf( fptr, " %s", mot );
  10. while( !feof( fptr ) ) {
  11. //Aqui deberias de agregar la variable leida a la variable  global
  12. fscanf( fptr, " %s", mot );
  13. } /* while */
  14. fclose( fptr );
  15. } else {
  16. i = -1;
  17. } /* if */
  18. return i;
  19. } /* IDtableLoad */
  20.  

Esta funcion hace lo siguiente:
Abrir el archivo
Lee un renglon
Lo  guarda en una variable local
Lee el siguiente renglon. y asi sucesivamente

Mas nunca guarda la variable locan el el arreglo global que tiene.

Código
  1. char IDtable[MAXID][IDLEN+1];

Al parecer es un buffer que solo tiene espacio para 116 DNI.

El como pasar la variable local al buffer global es tu tarea.

Sugerencias
usar memcpy
hacer un ciclo manual y copiar byte por byte.
Cambiar el buffer estatico por memoria dinamica.
Traducir del frances al español jajajajaja

Otra observacion importante el programa es vulnerable a buffer overflow. si el renglon leido desde el archivo es de mayor tamaño a BUFSIZ entonces escribira en las variables continuas del programa y causara un segment fault