Eliminar una línea de un archivo en C Idioma

Quiero eliminar ciertas líneas en un archivo e insertar ciertas líneas en el mismo archivo en función de si ciertas partes de la línea coinciden con una cadena especificada. ¿Hay alguna forma de hacerlo sin usar un archivo temporal para copiar el contenido, etc.?

El problema es que un archivo es (esencialmente) una matriz de bytes en el disco (o cualquier otro sustrato físico, pero, de todos modos, ¡bytes!), Y “una línea” puede tomar un número variable de bytes; así que insertar o quitar líneas (a menos que siempre esté reemplazando rigurosamente una línea con otra línea de exactamente la misma longitud en bytes) requeriría “desplazar” todo el rest del archivo “hacia arriba” o hacia “abajo” por la diferencia en bytes … que puede ser una operación extremadamente onerosa (ya que el rest del archivo puede ser gigabytes incluso si solo está cambiando la longitud de una línea por 1 byte hacia el principio del archivo).

Por lo tanto, tales operaciones pueden ser increíblemente onerosas y, por lo tanto, nunca se ofrecen como primitivas en CUALQUIER idioma que soporte archivos con longitud de línea variable (C, Python, Java, C ++, Ruby o CUALQUIER otro lenguaje similar). Es extremadamente improbable que realmente deba pagar un costo potencialmente sin consolidar en cuanto a rendimiento Y riesgo (un sistema o un locking de disco durante el “cambio” de GB o los datos hacia arriba o hacia abajo pueden destruir la usabilidad de su archivo completo y enorme), cuando La técnica perfectamente simple, adecuada, rápida, segura y razonable que está tratando de evitar tiene básicamente desventajas CERO (por lo que está lejos de ser evidente ¿POR QUÉ está tratando de evitarlo?).

Use un archivo de resultados diferente del archivo fuente, cuando termine el archivo resultante sobre el archivo fuente (una operación atómica en la mayoría de los sistemas si está dentro del mismo sistema de archivos), y realmente tiene lo mejor de todo mundos posibles.

No puede “cortar” fácilmente una sección de un archivo en el lugar. Siempre haces una copia temporal en alguna parte. Esto no es una cosa C; es cierto para cualquier idioma

Puede mapear el archivo, y luego, cuando encuentre la línea que desea borrar, puede insertar todo después de ella en la ubicación del comienzo de la línea. Preguntaría qué tan eficiente sería eso; el archivo temporal puede ser más rápido.

Si el archivo no es lo suficientemente grande como para procesarlo en la RAM, puede usar la lista de cadenas enlazadas, donde cada nodo representa una línea, es decir, el nodo de la lista vinculada se crea en función del carácter ‘\ n’ y luego puede inserte operaciones y elimine las operaciones en la lista vinculada según sea necesario y luego puede sobrescribir en el mismo archivo utilizando la lista vinculada.

Por ejemplo, mytext.txt

Este es un archivo de prueba

Se debe agregar una línea arriba

Esta línea tiene que ser eliminada

Ahora cuando crea una lista vinculada del archivo anterior, sería como

[Este es un archivo de prueba] -> [Se debe agregar una línea arriba] -> [Esta línea tiene que ser eliminada] -> [NULL]

Insertar operación cambiará la lista vinculada a

[Este es un archivo de prueba] -> [Esta es una nueva línea] -> [Se debe agregar una línea arriba] -> [Esta línea tiene que ser eliminada] -> [NULL]

La operación de borrado cambiará la lista vinculada a

[Este es un archivo de prueba] -> [Esta es una nueva línea] -> [Se debe agregar una línea arriba] -> [NULL]

Ahora puede escribir la lista vinculada en el archivo mytext.txt con el carácter ‘\ n’ al final de cada nodo.

El archivo final sería, mytext.txt

Este es un archivo de prueba

Esta es una nueva línea

Se debe agregar una línea arriba