Contar nuemero de lineas de un fichero

Iniciado por Cas980, 17 Abril 2014, 23:26 PM

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

Cas980

Estoy escribiendo un código usando ficheros, necesito saber cuantas lineas tiene el archivo para almacenar el espacio correspondiente. ¿¿como puedo contar el numero de lineas usando el fscanf??


A partir de ahí tengo que separar la informacion y guardarla en la estructura.
en el archivo tengo algo como esto

daniela,castillo,biologia,15
carlos,cervantes,fisica,14
diego,garcia,quimica,16


Algun consejo para hacerlo?? tenia pensado dividirlo usando la funcion strtok y despues ir copiando a cada variable pero aun no se muy bien como plantearlo.




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

struct alumno
{
      char nombre[30];
      char apellido[30];
      char materia[30];
      int edad;
}; struct alumno reg*;


int main()
{
    FILE *ptr;
    char c[80];
    char *b;
    int x=0;
   
    ptr=fopen("alumno.csv","r+");
   
    while(!feof (ptr))
    {
           fscanf(ptr,"%[^\n]s",&c);
           x++;
    }
   
    reg=(struct alumno*)malloc(x*sizeof(struct alumno));
    rewind(ptr);
   
    printf("numero de filas: %i",x);

     .
     .
     .
     .
     .
     .
     .
     .
     .    
   
    getch();
}

xoker

Tienes varias opciones, una poco eficiente seria contar el numero de '\n' que hay en el fichero mirando uno a uno cada caracter y cada vez que el caracter sea igual a '\n' sumas 1 en un contador.

Otra opcion es contar el numero de lineas, esta opcion es mas eficiente, en este video se explica exactamente como contar las lineas de un fichero:

[youtube=640,360]https://www.youtube.com/watch?v=hC2lrn81eco&list=PLw8RQJQ8K1ySN6bVHYEpDoh-CKVkL_uOF&index=42[/youtube]

Esta al comienzo! Espero que te sirva, un saludo.

rir3760

Cita de: Cas980 en 17 Abril 2014, 23:26 PMEstoy escribiendo un código usando ficheros, necesito saber cuantas lineas tiene el archivo para almacenar el espacio correspondiente. ¿¿como puedo contar el numero de lineas usando el fscanf??
Para conocer el numero de lineas en el archivo de texto lo mas fácil y sencillo es leer su contenido carácter por carácter, el numero de lineas esta dado por el numero de caracteres igual a '\n'.

Y si la estructura del archivo de entrada esta garantizado (tres palabras y un entero por linea separados entre si por comas) entonces puedes leer su contenido directamente con fscanf. Mas o menos así:
#include <stdio.h>
#include <stdlib.h>

#define NOM_ENTRADA  "alumno.csv"

struct alumno {
   char nombre[30];
   char apellido[30];
   char materia[30];
   int edad;
};

int main(void)
{
   FILE *entrada;
   int ch;
   struct alumno a;
   int num_lineas;
   
   if ((entrada = fopen(NOM_ENTRADA, "r")) == NULL){
      perror(NOM_ENTRADA);
      return EXIT_FAILURE;
   }
   
   num_lineas = 0;
   while((ch = fgetc(entrada)) != EOF)
      if (ch == '\n')
         num_lineas++;
   
   rewind(entrada);
   while (fscanf(entrada, " %[^,],%[^,],%[^,],%d", a.nombre, a.apellido, a.materia,
      &a.edad) == 4)
   {
      /* "a" contiene la informacion del nodo leido, se procesa en alguna forma ... */
      printf("%s\n%s\n%s\n%d\n\n", a.nombre, a.apellido, a.materia, a.edad);
   }
   fclose(entrada);
   
   /* ... */
   
   return EXIT_SUCCESS;
}


Pero si cualquier campo contiene espacios (por ejemplo un nombre como "Jose Maria") o la estructura de la linea es ligeramente mas complicada hay que cambiar la aproximación y utilizar fgets para obtener una linea y strtok para extraer cada uno de los campos.

Por ultimo deberías evitar el uso de la biblioteca conio de Borland, convertir al tipo apropiado el valor de retorno de malloc y utilizar la función feof para controlar la lectura del archivo. Mas información relacionada en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

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