PDA

Ver la Versión Completa : Borrar lineas de txt


eennzzoo
21-03-2014, 20:43:52
Hola tengo un archivo txt el cual contiene varios datos de distintos usuarios por ejemplo.
dni1
nombre1
apellido1
dni2
nombre2
apellido2

Tengo lo que se encargar de buscar y mostrar en los labels, me falta que una vez que busco a cierta persona la elimine del txt. Sin que me queden espacios en blancos, si quisiera eliminar al dni1, tendria que quedarme asi el txt:
dni2
nombre2
apellido2


TStrings *TS = new TStringList;
TS->LoadFromFile("datos.txt");


void __fastcall TfCliente::MostrarRegistro(const int pp,const int c) {
lblCliente->Caption = "Datos de "+TS->Strings[pp+1]+" "+TS->Strings[pp+2];
lblDni->Caption = TS->Strings[pp];
lblNombre->Caption = TS->Strings[pp+1];
lblApellido->Caption = TS->Strings[pp+2];
lblDireccion->Caption = TS->Strings[pp+3];
lblMail->Caption = TS->Strings[pp+4];
lblTelefono->Caption = TS->Strings[pp+5];
lblCelular->Caption = TS->Strings[pp+6];
lblEdad->Caption = TS->Strings[pp+7];
lblNacimiento->Caption = TS->Strings[pp+8];
lblNumeroCliente->Caption = c;
}
void __fastcall TfCliente::btnBuscarClick(TObject *Sender)
{
if (editBuscar->Text != ""){
int docu=0;
int c;
for(int i=0; i< TS->Count; i+=9) {
if (Trim(editBuscar->Text) == Trim(TS->Strings[i])) {
c=TS->Count/9;
MostrarRegistro(i,c);
editBuscar->Text = "";
break;}
else {
docu+=9;
if (docu == TS->Count) {
Application->MessageBox("El cliente no existe.","AVISO", MB_OK | MB_ICONEXCLAMATION);
editBuscar->Text = "";
lblCliente->Caption = "";
lblDni->Caption = "";
lblNombre->Caption = "";
lblApellido->Caption = "";
lblDireccion->Caption = "";
lblMail->Caption = "";
lblTelefono->Caption = "";
lblCelular->Caption = "";
lblEdad->Caption = "";
lblNacimiento->Caption = "";
lblNumeroCliente->Caption = "";
}
}
}
if (TS->Count == 0){
Application->MessageBox("El cliente no existe.","AVISO", MB_OK | MB_ICONEXCLAMATION);
}
}
else {
Application->MessageBox("Ingrese un numero de documento.","AVISO", MB_OK | MB_ICONEXCLAMATION);
}
}
void __fastcall TfCliente::btnEliminarClick(TObject *Sender)
{
if (lblApellido->Captiont != ""){

const int result = Application->MessageBox(("Desea eliminar al cliente " + lblApellido->Caption+" "+lblNombre->Caption+" ?").c_str() ,"AVISO", MB_YESNO | MB_ICONQUESTION);
switch (result)
{
case IDYES:
Application->MessageBox("El cliente fue eliminado correctamente.","Cliente eliminado", MB_OK);
break;
case IDNO:
break;
}
}
}

Casimiro Notevi
21-03-2014, 21:10:46
Muy bien, y ¿el problema?

eennzzoo
21-03-2014, 21:12:09
Muy bien, y ¿el problema?
Eliminar los datos del txt, de la persona que busco.

ecfisa
22-03-2014, 00:45:41
Hola eennzzoo


void DeleteData(TStrings *TS, String dni)
{
int ix = TS->IndexOf(dni);

if (ix != -1) {
if (MessageBox(0,"¿ Desea borrar los datos ?","",MB_YESNO)==IDYES) {
TS->Delete(ix+2);
TS->Delete(ix+1);
TS->Delete(ix);
}
} else
MessageBox(0,"No se encontró una persona con ese DNI","", MB_OK);
}


Ejemplo de uso:

void __fastcall TForm1::btnDeleteClick(TObject *Sender)
{
DeleteData(Lista, EditDNI->Text);
}


Saludos :)

eennzzoo
22-03-2014, 13:38:51
Hola eennzzoo


void DeleteData(TStrings *TS, String dni)
{
int ix = TS->IndexOf(dni);

if (ix != -1) {
if (MessageBox(0,"¿ Desea borrar los datos ?","",MB_YESNO)==IDYES) {
TS->Delete(ix+2);
TS->Delete(ix+1);
TS->Delete(ix);
}
} else
MessageBox(0,"No se encontró una persona con ese DNI","", MB_OK);
}


Ejemplo de uso:

void __fastcall TForm1::btnDeleteClick(TObject *Sender)
{
DeleteData(Lista, EditDNI->Text);
}


Saludos :)

Hola, lo probe, pero no borra nada del archivo. Por ejemplo puse TS->Delete(0); en el boton eliminar, y eso tendria que eliminar la primer linea del txt, pero el txt sigue estando igual.

ecfisa
22-03-2014, 19:28:51
Hola ennzzoo.
Hola, lo probe, pero no borra nada del archivo. Por ejemplo puse TS->Delete(0); en el boton eliminar, y eso tendria que eliminar la primer linea del txt, pero el txt sigue estando igual.
Si usaste el método Delete con el valor cero como argumento y no borró nada se me ocurren dos posibles causas:

El TStringList está vacío.
Tu C++ Builder funciona mal.

Mas probable es que el elemento haya sido efectívamente eliminado de la lista, pero el control que se encarga de visualizarla no se hubiera actualizado luego del borrado.

Para evitar confusiones te adjunto el código fuente de un ejemplo operativo, así podrás revisarlo con tranquildad. Solo descomprimilo en una carpeta, contiene el archivo de texto (file.txt).

Casimiro Notevi
22-03-2014, 19:33:28
El TStringList está vacío.
Tu C++ Builder funciona mal.
Seguramente es lo primero :)

escafandra
23-03-2014, 00:12:46
Hola, lo probe, pero no borra nada del archivo. Por ejemplo puse TS->Delete(0); en el boton eliminar, y eso tendria que eliminar la primer linea del txt, pero el txt sigue estando igual.

Creo que no habéis entendido a eennzzoo, tiene razón, no se borra del archivo.

Quizas eennzzoo está buscando un ajuste como este:

void DeleteData(TStrings *TS, String dni)
{
int ix = TS->IndexOf(dni);

if (ix != -1) {
if (MessageBox(0,"¿ Desea borrar los datos ?","",MB_YESNO)==IDYES) {
TS->Delete(ix+2);
TS->Delete(ix+1);
TS->Delete(ix);
Lista->SaveToFile(ExtractFilePath(Application->Name)+"file.txt");
}
} else
MessageBox(0,"No se encontró una persona con ese DNI","", MB_OK);
}


Saludos.

Casimiro Notevi
23-03-2014, 00:22:53
Pues sí, releyéndolo, parece que quiere borrarlo del fichero.

ecfisa
23-03-2014, 01:09:20
Creo que no habéis entendido a eennzzoo, tiene razón, no se borra del archivo.

Hola escafandra.

Si, realmente no lo interpreté de ese modo. No pensé que intentara borrar un dato del archivo de texto con el método Delete... seguramente por eso desestimé el resto del párrafo.

Creo entonces que vale aclararle a eennzzoo que una vez usado el método LoadFromFile, los datos del archivo de texto cargados en Lista residen en la memoria y cualquier acción que se realice sobre Lista se perderá finalizar si previamente no se salvan con el método SaveFromFile.

Se pueden tomar dos caminos:

Guardar la Lista luego de cada acción (agregado, modificado o borrado)
Guardar la Lista al finalizar previo a la liberación de Lista. (*)

(*) ejemplo:

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
Lista->SaveToFile('tu_archivo.txt');
delete Lista;
}


Saludos :)

eennzzoo
23-03-2014, 01:09:51
Pues sí, releyéndolo, parece que quiere borrarlo del fichero.

Si eso quiero, borrarlo del archivo. Mañana lo pruebo y les digo. Gracias.

eennzzoo
23-03-2014, 14:01:45
Creo que no habéis entendido a eennzzoo, tiene razón, no se borra del archivo.

Quizas eennzzoo está buscando un ajuste como este:

void DeleteData(TStrings *TS, String dni)
{
int ix = TS->IndexOf(dni);

if (ix != -1) {
if (MessageBox(0,"¿ Desea borrar los datos ?","",MB_YESNO)==IDYES) {
TS->Delete(ix+2);
TS->Delete(ix+1);
TS->Delete(ix);
Lista->SaveToFile(ExtractFilePath(Application->Name)+"file.txt");
}
} else
MessageBox(0,"No se encontró una persona con ese DNI","", MB_OK);
}


Saludos.

Ahora si funciona. Pero en vez de ser Lista->SaveToFile es TS->SaveToFile. Gracias.

ecfisa
23-03-2014, 20:38:20
Hola eennzzoo.

También recuerda que usando la línea

TS->SaveToFile(ExtractFilePath(Application->Name)+"file.txt");

al salir del form, guardarás todas las acciones previas realizadas en la lista, de otro modo tendrás que incluirla al finalizar cada accion (insertar, modificar o borrar).

Saludos :)

eennzzoo
24-03-2014, 02:05:23
Hola eennzzoo.

También recuerda que usando la línea

TS->SaveToFile(ExtractFilePath(Application->Name)+"file.txt");

al salir del form, guardarás todas las acciones previas realizadas en la lista, de otro modo tendrás que incluirla al finalizar cada accion (insertar, modificar o borrar).

Saludos :)

Ok gracias. Ahi lo probe y funciona bien.