Duda archivos en C (solucionado)

Iniciado por David8, 19 Mayo 2014, 11:07 AM

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

David8

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:

int main(void)
{
int N;
// codigo
FILE *archivo;
archivo = fopen(nombreArchivo.txt, "r");
N = mayorLinea(archivo);
// codigo
fclose(archivo);

return EXIT_SUCCESS;
}

int mayorLinea(FILE *arch)
{
char c;
int contador = 0;
int aux = 0;

while(c != EOF){
c = fgetc(arch);

if(c != '\n' && c != EOF){
contador++;
}
else{
if(contador > aux){
aux = contador;
}
contador == 0;
}
}

return aux;
}

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

eferion

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.


int mayorLinea(FILE *arch)
{
char c;
int contador = 0;
int aux = 0;

while(c != EOF){


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


if(contador > aux){
aux = contador;
}
contador == 0;


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

David8

Cita de: 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.


int mayorLinea(FILE *arch)
{
char c;
int contador = 0;
int aux = 0;

while(c != EOF){


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


if(contador > aux){
aux = contador;
}
contador == 0;


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

Hice lo que me dijiste
int mayorLinea(FILE *arch)
{
char c = 'a';
int contador = 0;
int aux = 0;

c = fgetc(arch);
do{
if(c != '\n'){
contador++;
}
else{
if(contador > aux){
aux = contador;
}
contador = 0;
}

c = fgetc(arch);

} while(c != EOF);

return aux;
}


y solucionado

Muchas gracias

eferion


rir3760

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í:
int mayorLinea(FILE *in)
{
   int ch;
   int i;
   int max;
   
   i = max = 0;
   while ((ch = fgetc(in)) != EOF){
      i++;
     
      if (ch == '\n'){
         if (i > max)
            max = i;
         i = 0;
      }
   }
   
   return max;
}


Un saludo
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