Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Borrar caracteres de un txt

Estas en el tema de Borrar caracteres de un txt en el foro de C/C++ en Foros del Web. Hola amigos, espero que se encuentren muy bien. Tengo unos txt grandes llenos de información que terminan así: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original . ...
  #1 (permalink)  
Antiguo 28/06/2016, 11:55
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 10 años, 4 meses
Puntos: 1
Borrar caracteres de un txt

Hola amigos, espero que se encuentren muy bien.

Tengo unos txt grandes llenos de información que terminan así:
Código C++:
Ver original
  1. .
  2. .
  3. .
  4. [109,   116,    123,    128,    147],
  5. [109,   116,    123,    142,    115],
  6. [109,   116,    123,    142,    134],
  7. ]

Y deseo eliminar ese ultimo "]"y la "," de la ultima linea, supuse que era una tarea muy fácil, como escribir un archivo. Pero para mi sorpresa no encontré mucha información de cómo hacerlo. Por ahora tengo este programa:

Código C++:
Ver original
  1. #include <iostream>;
  2. #include <fstream>;
  3. #include <string>;
  4. using namespace std;
  5.  
  6. void path(string &s);
  7.  
  8. int main() {
  9.     string donde;
  10.     path(donde);
  11.     donde = donde + "texto.txt";
  12.     fstream fin;
  13.  
  14.     fin.open(donde, fstream::ate | fstream::in | fstream::out); //ate es para empezar el cursor al fnial, es diferente de ::app
  15.     if (fin.is_open()== false) {
  16.         cout << "Horror...";
  17.         return 0;
  18.     }
  19.     //fin << "\b\b"; //Aquí se supone que debería poder hacer un backspace pero no funciona
  20.    
  21.     fin.close();
  22.  
  23.     cin.get();
  24.     return 0;
  25. }
  26.  
  27. void path(string &s) {
  28.     char* pchar;
  29.     _get_pgmptr(&pchar);
  30.     string aux(pchar); int y = 0, i = 0;
  31.     for (i = aux.size(); i >= 0; i--) {
  32.         if (aux[i - 1] == char(92)) {
  33.             y++;
  34.             if (y == 1) break;
  35.         }
  36.     }
  37.     aux = aux.substr(0, i);
  38.     s = aux;
  39. }

Alguna idea?

Update: Sé que se podría leer el archivo y escribir otro sin ese carácter, pero por la cantidad de archivos y sus tamaños (600mb y más) no lo veo adecuado yo busco otras alternativas.

Gracias.

Última edición por dmorill; 28/06/2016 a las 12:13 Razón: Más información.
  #2 (permalink)  
Antiguo 29/06/2016, 02:11
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Borrar caracteres de un txt

Si abres el fichero con las funciones de C puedes probar algo tal que:

Código C++:
Ver original
  1. FILE * file = fopen(...);
  2. int toDelete = 2; // o los que sean
  3. fseeko(file ,-toDelete ,SEEK_END);
  4. int position = ftello(file);
  5. ftruncate(fileno(file),position);

Otra opción es que abras el fichero, calcules
Con las clases de C++ únicamente lo podrás conseguir leyendo el fichero completamente, eliminar los caracteres sobrantes y volviendo a escribirlo.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 29/06/2016, 09:11
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Borrar caracteres de un txt

Hola, gracias eferion. He visto que en la mayoría de lugares recomiendan copiar un archivo temporal y luego reemplazarlo.

Pero he encontrado esta librería "<experimental/filesystem>" y el método "resize_file", con los cuales he logrado mi cometido. Pero en el fondo supongo que harán algo parecido a copiar en un temporal y luego reemplazarlo.

Has utilizado está librería? qué conoces de ella? pues parece que hace parte de la std.

Código C++:
Ver original
  1. #include <iostream>;
  2. #include <fstream>;
  3. #include <string>;
  4. #include <experimental/filesystem>;
  5. using namespace std;
  6.  
  7. void path(string &s);
  8.  
  9. int main() {
  10.     string donde;
  11.     path(donde);
  12.     donde = donde + "texto.txt";
  13.     fstream file;
  14.  
  15.     file.open(donde, fstream::ate | fstream::in | fstream::out);    //ate es para empezar el cursor al fnial, es diferente de ::app
  16.     if (file.is_open()== false) {
  17.         cout << "Horror...";
  18.         return 0;
  19.     }
  20.     long pos = file.tellp();
  21.     experimental::filesystem::resize_file(donde, pos-4);
  22.     file.close();
  23.  
  24.     //cin.get();
  25.     return 0;
  26. }

Saludos,
  #4 (permalink)  
Antiguo 29/06/2016, 09:20
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 9 meses
Puntos: 27
Respuesta: Borrar caracteres de un txt

Experimental es una librería dónde los implementadores de compiladores y librerías estándar van creando y probando conceptos propuestos para futuras versiones de C++. Las librerías dentro de experimental pueden ser aceptadas o no en el futuro.

En concreto filesystem se incorporará en C++17 (Aquí tienes toda la especificación de diseño (en inglés))

Para tu caso se dice que resize() funcioná como truncate() de sistemas POSIX, por lo que si reduces el tamaño del archivo se eliminan los elementos que sobran.

Saludos.
  #5 (permalink)  
Antiguo 29/06/2016, 09:22
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Borrar caracteres de un txt

Esa librería es ciertamente inestable. Se suele usar como paso previo a incorporar nuevos elementos al estandar, por lo que si en algún momento cambias de estándar es bastante probable que la clase no solo no se encuentre ahí, sino que además puede haber sufrido cambios o incluso haber desaparecido.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #6 (permalink)  
Antiguo 29/06/2016, 11:11
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Borrar caracteres de un txt

Gracias a todos por sus respuestas. Una pregunta más, eso solo pasa con c++? o con los demás lenguajes bueno eferion me dio una alternativa en c.

Entonces programas como word, realmente copian todo contenido del documento (100 hojas por ejemplo) y luego lo reemplaza?? cuando uno borra parte del texto?

saludos,
  #7 (permalink)  
Antiguo 29/06/2016, 12:42
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Borrar caracteres de un txt

Un documento de word puede ocupar ¿10MB? En un equipo con 2 GB de RAM es despreciable...

A la hora de programar primero céntrate primero en que funcione y luego, si hace falta, optimiza
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: delete, txt
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:20.