2011-11-17 14 views
5

Por lo tanto, estoy tratando de encontrar una forma 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:¿Cómo se escribe() una línea específica de un archivo en C?

Esencialmente, me preguntaba si era una manera 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 para recorrer el archivo n-1 veces sólo para llegar a la línea de orden n ... simplemente doesn Parece muy eficiente (y, como es tarea, necesito obtener un 100% jaja).

Cualquier ayuda sería apreciada.

+0

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

+0

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

+0

Algunos mecanismos para almacenar archivos de texto podrían proporcionar una manera plausible de acceder a la línea enésima en tiempo constante, o al menos mejor que el tiempo lineal. Probablemente algunos de los formatos de archivo utilizados en VMS hacen esto. Pero la biblioteca estándar de C no expone ninguno de esos mecanismos, y en la mayoría de los sistemas operativos ni siquiera es posible para los archivos de texto sin formato, a menos que construya un índice usted mismo. Entonces, no es una pregunta poco razonable, pero la respuesta es no. –

Respuesta

7

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 map o índice que le permitiría saltar a la línea n th.

Si supiera que, por ejemplo, cada línea del archivo tiene la misma longitud, entonces podría usar el acceso aleatorio para saltar a una línea en particular. Sin un conocimiento adicional de este tipo, simplemente no tiene más remedio que recorrer todo el archivo hasta llegar a la línea deseada.

3

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

8

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.

2

Si desea obtener la ené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 inicio de una línea en particular.

5

En primer lugar, su línea

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

es mejor escribir como:

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

El + 1 que se necesita para proporcionar espacio para la terminación '\0' carácter; strlen() no explica eso. No es necesario enviar el resultado de malloc() en C, y en algunos casos puede enmascarar errores. sizeof(char) es 1 por definición, por lo que no es necesario.

Y nunca cambia el valor de targetline, por lo que su bucle nunca terminará.

Pero en respuesta a su pregunta, si tiene un archivo de texto y desea leer la línea enésima, 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 el archivo cambia 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á.)

+1

@David: gracias por la edición. –

Cuestiones relacionadas