Leyendo una línea a la vez en C

3 minutos de lectura

avatar de usuario
Mahesh Gupta

¿Qué método se puede usar para leer una línea a la vez de un archivo en C?

estoy usando el fgets función, pero no funciona. Solo lee el token separado por espacios.

¿Qué hacer?

  • Entonces, ¿realmente no quiere leer una línea, quiere leer hasta que se encuentre un espacio? ¿O estás diciendo que fgets se detiene en espacios en lugar de saltos de línea?

    –Eric Petroelje

    3 de marzo de 2010 a las 16:06

  • debe detenerse solo en el carácter de nueva línea.

    – Mahesh Gupta

    3 de marzo de 2010 a las 16:21

  • Aquí está mi entrada:: START A DC 10 B DS 20 STOP Obtuve:: START AB STOP como mi salida..

    – Mahesh Gupta

    3 de marzo de 2010 a las 16:21

avatar de usuario
rekha_sri

Use el siguiente programa para obtener línea por línea de un archivo.

#include <stdio.h>
int main ( void )
{
  char filename[] = "file.txt";
  FILE *file = fopen ( filename, "r" );

  if (file != NULL) {
    char line [1000];
    while(fgets(line,sizeof line,file)!= NULL) /* read a line from a file */ {
      fprintf(stdout,"%s",line); //print the file contents on stdout.
    }

    fclose(file);
  }
  else {
    perror(filename); //print the error message on stderr.
  }

  return 0;
}

avatar de usuario
lucas

Esto debería funcionar, cuando no puedes usar fgets() por alguna razón.

int readline(FILE *f, char *buffer, size_t len)
{
   char c; 
   int i;

   memset(buffer, 0, len);

   for (i = 0; i < len; i++)
   {   
      int c = fgetc(f); 

      if (!feof(f)) 
      {   
         if (c == '\r')
            buffer[i] = 0;
         else if (c == '\n')
         {   
            buffer[i] = 0;

            return i+1;
         }   
         else
            buffer[i] = c; 
      }   
      else
      {   
         //fprintf(stderr, "read_line(): recv returned %d\n", c);
         return -1; 
      }   
   }   

   return -1; 
}

  • Gracias, amigo, está funcionando, pero todavía tengo un problema.

    – Mahesh Gupta

    3 de marzo de 2010 a las 16:36

  • Eso es extraño, solo puedo usar printf("%s\n", buffer); y genera todo el búfer

    – LucasN

    3 de marzo de 2010 a las 16:38

  • sí, es extraño para mí también. porque estaba funcionando para todos los programas anteriores… :'(

    – Mahesh Gupta

    3 de marzo de 2010 a las 16:48

  • ¿Está seguro de que su archivo no contiene ningún terminador de cadena?

    – LucasN

    3 de marzo de 2010 a las 16:52

Si está programando para una plataforma que tiene disponible la biblioteca GNU C, puede usar getline():

http://www.gnu.org/s/libc/manual/html_node/Line-Input.html

  • Esa función también está disponible en sistemas BSD, solo para información;)

    – José L. Patiño

    28 de julio de 2013 a las 9:03

avatar de usuario
jaredpar

los fgets función leerá una sola línea de un archivo o num personajes donde num es el segundo parámetro pasado a fgets. ¿Está pasando un número lo suficientemente grande como para leer la línea?

Por ejemplo

// Reads 500 characters or 1 line, whichever is shorter
char c[500];
fgets(c, 500, pFile);

contra

// Reads at most 1 character
char c;
fgets(&c,1,pFile);

avatar de usuario
mike ñame

Esto es más un comentario que una respuesta completa, pero no tengo suficientes puntos para comentar. 🙂

Aquí está el prototipo de función para fgets():

char *fgets(char *restrict s, int n, FILE *restrict stream);

Leerá n-1 bytes o hasta una nueva línea o eof. Para más información ver aquí

avatar de usuario
didier trosset

fgets() debería ser el camino a seguir…

avatar de usuario
Andrei

utilizar cualquiera fgets si sabe que sus líneas caben en el búfer o usan fgetc para un mayor control sobre la lectura

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad