Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Exportar datos ListView a .txt (https://www.clubdelphi.com/foros/showthread.php?t=87952)

andres_89 23-03-2015 21:20:51

Exportar datos ListView a .txt
 
Hola amigos,

Tengo un problema para exportar los datos de un Listview a un archivo txt, ya cree el archivo txt con este codigo:

Código:

AnsiString nombrearchivo = "Reporte";
creat(nombrearchivo.c_str(),1);

          ofstream write_archive(nombrearchivo.c_str()) ;
          write_archive << ("Lista de alumnos: \n");     
          write_archive.close();

Pero no puedo hacer hasta el momento el código para agregar los datos de las columnas "'Nombre" y "Apellidos" a ese archivo de texto, considerando que pueden haber "n" filas, ya que en un día se pueden registrar 2 alumnos, al día siguiente 100 alumnos, etc. y mi reporte es diario con la cantidad de alumnos registrados ese dia.

Un ejemplo de mi ListView es este:


Espero me puedan ayudar, gracias de antemano.

Saludos.

ecfisa 23-03-2015 23:22:22

Hola andres_89.

Ejemplo usando STL:
Código PHP:

#include <fstream>
...
{
  
AnsiString nombrearchivo "Reporte.txt";
  
std::ofstream ofs;
  
TListViewlv static_cast<TListView*>(ListView1);

  
ofs.open(nombrearchivo.c_str(), std::ofstream::out std::ofstream::app);
  for(
int i 0lv->Items->Counti++)
    
ofs << (lv->Items->Item[i]->Caption "," +
            
lv->Items->Item[i]->SubItems->Text).c_str();
  
ofs.close();



Saludos :)

andres_89 24-03-2015 00:07:52

Se muestra codificado
 
Hola ecfisa,

gracias por tu respuesta, pero al momento de ejecutarlo y guardarlo, me lo guarda en hexadecimal, se ve puros numeros, creo que tiene algo que ver con el guardado en el código.

Estaré jugando por acá haber si me sale.

Saludos.

ecfisa 24-03-2015 01:04:33

Hola Andres.

Usando los datos que mostraste para el ListView (nombres, apellidos) el código funciona correctamente.

Codigo de prueba:
Código PHP:

#include <fstream>
void __fastcall TForm1::btnSaveClick(TObject *Sender)
{
  
AnsiString nombrearchivo "C:\\tmp\\Reporte.txt";
  
std::ofstream ofs;
  
TListViewlv static_cast<TListView*>(ListView1);

  
ofs.open(nombrearchivo.c_str(), std::ofstream::out std::ofstream::app);
  for(
int i 0lv->Items->Counti++)
    
ofs << (lv->Items->Item[i]->Caption "," +
            
lv->Items->Item[i]->SubItems->Text).c_str();
  
ofs.close();

  
// mostrar el contenido del archivo
  
Memo1->Lines->LoadFromFile(nombrearchivo);


Resultado:


Saludos :)

ecfisa 24-03-2015 01:14:21

Hola de nuevo.

No se si es requisito que uses STL, pero con VCL tal vez te resulte mas simple:
Código PHP:

void __fastcall TForm1::btnSaveClick(TObject *Sender)
{
  
AnsiString nombrearchivo "C:\\tmp\\Reporte.txt";
  
TListViewlv static_cast<TListView*>(ListView1);

  
TStringssl = new TStringList;
    for(
int i 0lv->Items->Counti++)
    
sl->Add(lv->Items->Item[i]->Caption "," +
            
lv->Items->Item[i]->SubItems->Text);
  
sl->SaveToFile(nombrearchivo);
  
delete sl;
  
// mostrar el contenido del archivo
  
Memo1->Lines->LoadFromFile(nombrearchivo);


Saludos :)

andres_89 24-03-2015 01:59:14

Listo
 
Hola ecfisa,

Justo estaba pensando hacerlo con puntero porque no logre hacer funcionar tu primer código en embarcadero c++.
Tu último código en VLC me funciono bien.
El anterior con STL me funciono bien en C++ Builder pero me mostraba digitos en hexadecimal en embarcadero C++.
El de VLC me ejecuto normal en ambos compiladores, me parece que fuera ya un tema de los compiladores que en embarcadero hay que configurar en sus opciones, por ahora me quedo con el STL, ya que tengo que trabajarlo en embarcadero por el tema que ya se compro la licencia.

De verdad te agradesco mucho por tu tiempo y ayuda ecfisa. ^\||/

Saludos.

andres_89 30-03-2015 19:38:01

Actualizar sin eliminar
 
Cita:

Empezado por ecfisa (Mensaje 490361)
Hola de nuevo.

No se si es requisito que uses STL, pero con VCL tal vez te resulte mas simple:
Código PHP:

void __fastcall TForm1::btnSaveClick(TObject *Sender)
{
  
AnsiString nombrearchivo "C:\\tmp\\Reporte.txt";
  
TListViewlv static_cast<TListView*>(ListView1);

  
TStringssl = new TStringList;
    for(
int i 0lv->Items->Counti++)
    
sl->Add(lv->Items->Item[i]->Caption "," +
            
lv->Items->Item[i]->SubItems->Text);
  
sl->SaveToFile(nombrearchivo);
  
delete sl;
  
// mostrar el contenido del archivo
  
Memo1->Lines->LoadFromFile(nombrearchivo);


Saludos :)

Hola ecfisa, habrá algún parámetro que me permita guardar esos datos pero sin borrar el archivo ya creado anteriormente?, por ejemplo el dia lunes creo el reporte "ejemplo.txt" y el siguiente lunes actualizo a ese mismo reporte los nuevos datos, mostrandome los antiguos y nuevos datos, ya que con el código que se tiene ahora, cada vez que guardo los datos me borra los anteriores y me sobrepone los nuevos en el mismo archivo.

Saludos.

ecfisa 30-03-2015 23:19:09

Hola andres_89.

Tal vez te resulte mejor unificar ambas acciones en una función:
Código PHP:

void appendData(TListView *lv, const AnsiString &fileName,
  const 
bool &append=true) {

  
TStringssl = new TStringList;

  if (
append && FileExists(fileName))
    
sl->LoadFromFile(fileName);

  for(
int i 0lv->Items->Counti++)
    
sl->Add(lv->Items->Item[i]->Caption "," +
            
lv->Items->Item[i]->SubItems->Text);

  
sl->SaveToFile(fileName);
  
delete sl;


El parámetro append dictamina si se agregan o sobreescriben los datos, por defecto(omisión) se agregan.

Ejemplo de uso:
Código PHP:

void __fastcall TForm1::btnAppendClick(TObject *Sender)  {
  
appendData(ListView1"C:\\tmp\\Reporte.txt"CheckBox1->Checked);


Para el ejemplo uso como argumento el estado de la propiedad Checked de un TCheckBox. Marcado agrega, si no sobreescribe.

Saludos :)

andres_89 31-03-2015 00:29:43

Gracias ecfisa,

es un excelente código y queda para el foro para otros, ya que no encontre ni uno sobre este tema en los foros de builder, ya pude terminar con esta parte, te lo mil agradesco.

Saludos.


La franja horaria es GMT +2. Ahora son las 05:03:34.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi