txt lenguaje leer lectura guardarlo guardar escritura ejercicios datos contenido borrar arreglo archivos archivo c file-io

leer - Eliminar una línea de un archivo en lenguaje C



lectura y escritura de archivos en c++ (3)

Quiero eliminar ciertas líneas en un archivo e insertar ciertas líneas en el mismo archivo según si ciertas partes de la línea coinciden con una cadena específica. ¿Hay alguna forma de hacerlo sin utilizar 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; por lo tanto, para insertar o eliminar líneas (a menos que siempre esté reemplazando rigurosamente una línea con otra línea de exactamente la misma longitud en bytes), se requerirá "desplazar" el resto del archivo "arriba" o "abajo" por la diferencia en bytes ... lo que puede ser una operación extremadamente onerosa (ya que el resto del archivo pueden ser gigabytes incluso si solo está cambiando la longitud de una línea en 1 byte hacia el principio del archivo).

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

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


No se 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.

Podría hacer un mmap del archivo y luego, cuando encuentre la línea que desea borrar, puede guardar todo después de la ubicación del inicio de la línea. Me preguntaría cuán eficiente sería eso; el archivo temporal podría ser más rápido.


Si el archivo no es lo suficientemente grande como para procesarlo en la RAM, entonces puede usar la Lista de cadenas vinculadas, donde cada nodo representa una Línea, es decir, el nodo de la lista vinculada se crea basándose en el carácter ''/ n'' y luego puede inserte operaciones y elimine 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

Hay que añadir una línea arriba.

Esta línea tiene que ser eliminada

Ahora, cuando creas una lista enlazada del archivo anterior, sería como

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

La operación de inserción cambiará la lista enlazada a

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

La Operación Eliminar cambiará la lista enlazada a

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

Ahora puede escribir la lista vinculada al 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 linea

Hay que añadir una línea arriba.