¿Cómo fgets () una línea específica de un archivo en C?

4 minutos de lectura

¿Como fgets una linea especifica de un archivo en
gfppaste

Entonces, estoy tratando de encontrar una manera de fgets() una línea específica en un archivo de texto en C, para copiar el contenido de la línea en un búfer más permanente:

Esencialmente, me preguntaba si había una forma de hacerlo sin algo similar al siguiente código:

FILE *fp;
fp = fopen(filename, "r");

char line[256];
char * buffer;
int targetline = 10;
while( targetline > 0)
{
    fgets(line, 256, fp)
}

buffer =(char*)malloc(sizeof(char) * strlen(line));
strcpy(buffer, line);

Así que básicamente no quiero iterar a través del archivo n-1 veces solo para llegar a la línea n… simplemente no parece muy eficiente (y, siendo esta tarea, necesito obtener un 100% jaja) .

Cualquier ayuda sería apreciada.

  • Si sus líneas pueden tener una longitud arbitraria, ¿cómo espera omitir n líneas en tiempo constante?

    – KerrekSB

    17 de noviembre de 2011 a las 22:17

  • La única alternativa real es crear un índice de dónde comienza cada línea (lea el archivo una vez, cree el índice, luego lo usa para buscar directamente una línea hasta que el archivo cambie). También tenga en cuenta que su malloc necesita agregar 1 para dejar espacio para el terminador NUL.

    – Jerry Ataúd

    17 de noviembre de 2011 a las 22:18

  • Algunos mecanismos para almacenar archivos de texto podrían proporcionar plausiblemente una forma de acceder a la línea N en tiempo constante, o al menos mejor que en tiempo lineal. Probablemente algunos de los formatos de archivo usados ​​en VMS hagan esto. Pero la biblioteca estándar de C no expone ningún mecanismo de este tipo, y en la mayoría de los sistemas operativos ni siquiera es posible para archivos de texto sin formato, a menos que cree un índice usted mismo. Así que no es una pregunta irrazonable, pero la respuesta es no.

    –Keith Thompson

    17 de noviembre de 2011 a las 22:23

A menos que sepa algo más sobre el archivo, no puede acceder a líneas específicas al azar. Las nuevas líneas están delimitadas por la presencia de caracteres de final de línea y, en general, pueden aparecer en cualquier lugar. Los archivos de texto no vienen con un mapa o índice eso te permitiría saltar a la nel línea.

Si supiera que, por ejemplo, todas las líneas del archivo tienen la misma longitud, entonces podría usar el acceso aleatorio para saltar a una línea en particular. Sin conocimientos adicionales de este tipo, simplemente no tiene más remedio que iterar a través de todo el archivo hasta llegar a la línea deseada.

Si conoce la longitud de cada línea, puede usar fseek para saltar a la línea que desee.

De lo contrario, debe pasar por todas las líneas.

1647663666 907 ¿Como fgets una linea especifica de un archivo en
keith thompson

En primer lugar, su línea

buffer =(char*)malloc(sizeof(char) * strlen(line));

se escribe mejor como:

buffer = malloc(strlen(line) + 1);

los + 1 es necesario para proporcionar espacio para la terminación ‘\0‘ personaje; strlen() no da cuenta de eso. Lanzar el resultado de malloc() en C no es necesario, y en algunos casos puede enmascarar errores. sizeof(char) es 1 por definición, por lo que no es necesario.

Y nunca cambias el valor de targetlinepor lo que su ciclo nunca terminará.

Pero en respuesta a su pregunta, si tiene un archivo de texto y desea leer la línea N del mismo, debe leer y omitir las primeras líneas N-1 para acceder a él. (Es posible configurar un índice separado, pero crear el índice requiere leer el archivo de todos modos, y mantener el índice actualizado a medida que cambia el archivo es un problema difícil, probablemente más allá de lo que está haciendo ahora. Y no es particularmente necesario; el tiempo para leer 10 líneas de un archivo no se notará).

Me temo que no hay otra forma de obtener la enésima línea en el archivo. Tienes que pasar. No hay acceso aleatorio dentro del archivo.

Si desea obtener la n-ésima línea de un archivo de texto, debe leer las n-1 líneas anteriores. Esa es la naturaleza de un archivo secuencial. A menos que sepa que todas sus líneas tienen la misma longitud, no hay forma de posicionarse de manera confiable al comienzo de una línea en particular.

¿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