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.?Eliminar una línea de un archivo en C Idioma
Respuesta
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!), 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 resto del archivo "hacia arriba" o hacia "abajo" por la diferencia en bytes ... que puede ser una operación extremadamente onerosa (ya que el resto 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, estas 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 bloqueo 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?).
Utilice un archivo de resultados diferente del archivo fuente, cuando termine el archivo de resultados 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 El mejor de los 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 mmap el archivo, y luego cuando encuentre la línea que desea borrar, puede memcpy todo después de ella en la ubicación del inicio 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 para procesar en la RAM, puede usar la lista de cadenas enlazadas, donde cada nodo representa una línea, que es un nodo de la lista vinculada creada en base al carácter '\ n' y luego puede insertar operaciones y eliminar operaciones en la lista vinculada según sea necesario y luego puede sobrescribir en el mismo archivo usando la lista vinculada.
Por ejemplo, mytext.txt
Este es un archivo de prueba
Una línea tiene que ser añadido por encima de
Esta línea tiene que ser eliminado
Ahora cuando se crea una lista enlazada de archivo de arriba, sería como
[Este es un archivo de prueba] -> [Se debe agregar una línea arriba] -> [Esta línea tiene que ser eliminado] -> [NULL]
Insertar Operación cambiará la lista enlazada a
[Este es un archivo de prueba] -> [Esta es una nueva línea] -> [A la línea tiene que ser añadido más arriba] -> [Esta línea tiene que ser eliminado] -> [NULL]
operación de borrado cambiará la lista enlazada a
[Este es un archivo de prueba] - > [Thi s es una nueva línea] -> [Una línea tiene que añadir más arriba] -> [NULL]
Ahora se puede escribir la lista enlazada al archivo MyText.txt con 'n \' carácter en el final de cada nodo
el archivo final sería, MyText.txt
Este es un archivo de prueba
Esta es una nueva línea
Una línea tiene que ser añadido por encima de
- 1. Eliminar la última línea de un archivo
- 2. Eliminar un archivo en C
- 3. ¿Cómo eliminar una línea de un archivo de texto en C#?
- 4. ¿Cómo eliminar saltos de línea de un archivo en Java?
- 5. C Eliminar la primera línea de un archivo de texto sin reescribir el archivo
- 6. La lectura de un archivo línea por línea en C#
- 7. eliminar una línea en Eclipse
- 8. ¿Cómo leer un archivo .gz línea por línea en C++?
- 9. Recursos de idioma de ensamblado en línea
- 10. ¿Lees una línea aleatoria de un archivo? C#
- 11. Eliminar todo en un directorio excepto un archivo en C#
- 12. C++ 11: ¿un nuevo idioma?
- 13. Cómo eliminar un archivo con Visual C++?
- 14. Cómo utilizar PowerShell para eliminar espacio del final de una línea en un archivo de texto
- 15. Adjuntar una nueva línea en un archivo (archivo de registro) en C++
- 16. Eliminar nueva línea del final del archivo
- 17. Cambiar idioma en C#
- 18. Eliminar saltos de línea usando C#
- 19. Eliminar una línea del búfer en un script de vim
- 20. ¿Cómo leer una línea de un archivo de texto en c/C++?
- 21. Editar una línea específica de un archivo de texto en C#
- 22. Eliminar archivo usando C# Hilo
- 23. línea de escritura en un archivo utilizando C
- 24. Eliminar archivo en C++ bajo UNIX
- 25. ¿Hay una línea para leer en un archivo en una cadena en C++?
- 26. Eliminar último carácter/línea
- 27. Eliminar una clave de un mapa C++
- 28. ¿Hay alguna manera de definir la función C en línea en un archivo .c en lugar de un archivo .h?
- 29. Una forma rápida de eliminar una línea en netBeans
- 30. ¿Cómo borrar la última línea en un archivo de texto?
El el archivo temporal es mucho * más seguro *. – RBerteig
De acuerdo, esta no sería mi primera opción ... o de hecho, cualquier opción. Es lo único que se me ocurre que podría satisfacer la solicitud. Este enfoque es posiblemente más seguro (no hay problemas de permisos de archivos temporales), pero acepto que se corromperá el archivo en caso de que se produzca algún error. –