Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: David8 en 19 Mayo 2014, 11:07 am



Título: Duda archivos en C (solucionado)
Publicado por: David8 en 19 Mayo 2014, 11:07 am
Hola de nuevo. Resulta que estoy haciendo un programa que involucra archivos y hay un segmento en el que me resulta útil saber la línea más larga del archivo.

Para ello tengo este código:
Código
  1. int main(void)
  2. {
  3. int N;
  4. // codigo
  5. FILE *archivo;
  6. archivo = fopen(nombreArchivo.txt, "r");
  7. N = mayorLinea(archivo);
  8. // codigo
  9. fclose(archivo);
  10.  
  11. return EXIT_SUCCESS;
  12. }
  13.  
  14. int mayorLinea(FILE *arch)
  15. {
  16. char c;
  17. int contador = 0;
  18. int aux = 0;
  19.  
  20. while(c != EOF){
  21. c = fgetc(arch);
  22.  
  23. if(c != '\n' && c != EOF){
  24. contador++;
  25. }
  26. else{
  27. if(contador > aux){
  28. aux = contador;
  29. }
  30. contador == 0;
  31. }
  32. }
  33.  
  34. return aux;
  35. }
  36.  
La duda es que si imprimo N en el main() me sale siempre 0. Me parece que la forma en la que llamo a la función es errónea, pero no encuentro tal error.
Un saludo y gracias


Título: Re: Duda archivos en C
Publicado por: eferion en 19 Mayo 2014, 11:16 am
En primer lugar, 'c' no está inicializado. Pero además, dado que el valor que tenga 'c' en la primera iteración es indiferente, deberías replantearte cambiar el while por un do-while.

Código
  1. int mayorLinea(FILE *arch)
  2. {
  3. char c;
  4. int contador = 0;
  5. int aux = 0;
  6.  
  7. while(c != EOF){

En la siguiente sección, no reinicias la variable "contador", sino que estás forzando una comparación:

Código
  1. if(contador > aux){
  2. aux = contador;
  3. }
  4. contador == 0;

A ese "==" le sobra uno de los dos caracteres.


Título: Re: Duda archivos en C
Publicado por: David8 en 19 Mayo 2014, 11:24 am
En primer lugar, 'c' no está inicializado. Pero además, dado que el valor que tenga 'c' en la primera iteración es indiferente, deberías replantearte cambiar el while por un do-while.

Código
  1. int mayorLinea(FILE *arch)
  2. {
  3. char c;
  4. int contador = 0;
  5. int aux = 0;
  6.  
  7. while(c != EOF){

En la siguiente sección, no reinicias la variable "contador", sino que estás forzando una comparación:

Código
  1. if(contador > aux){
  2. aux = contador;
  3. }
  4. contador == 0;

A ese "==" le sobra uno de los dos caracteres.

Hice lo que me dijiste
Código
  1. int mayorLinea(FILE *arch)
  2. {
  3. char c = 'a';
  4. int contador = 0;
  5. int aux = 0;
  6.  
  7. c = fgetc(arch);
  8. do{
  9. if(c != '\n'){
  10. contador++;
  11. }
  12. else{
  13. if(contador > aux){
  14. aux = contador;
  15. }
  16. contador = 0;
  17. }
  18.  
  19. c = fgetc(arch);
  20.  
  21. } while(c != EOF);
  22.  
  23. return aux;
  24. }

y solucionado

Muchas gracias


Título: Re: Duda archivos en C (solucionado)
Publicado por: eferion en 19 Mayo 2014, 11:28 am
De nada hombre.

Un placer.


Título: Re: Duda archivos en C (solucionado)
Publicado por: rir3760 en 19 Mayo 2014, 18:36 pm
Las funciones getchar, fgetc y getc retornan un valor de tipo int, este se debe almacenar en una variable del mismo tipo para evitar problemas, también se pueden evitar las sentencias duplicadas para la lectura del archivo.

Con los cambios la función termina así:
Código
  1. int mayorLinea(FILE *in)
  2. {
  3.   int ch;
  4.   int i;
  5.   int max;
  6.  
  7.   i = max = 0;
  8.   while ((ch = fgetc(in)) != EOF){
  9.      i++;
  10.  
  11.      if (ch == '\n'){
  12.         if (i > max)
  13.            max = i;
  14.         i = 0;
  15.      }
  16.   }
  17.  
  18.   return max;
  19. }

Un saludo