¿Cómo puedo grabar y leer ficheros con c++ Builder?

cormac
21 de Septiembre del 2003
¿Alguien me puede poner un ejemplo de cómo se puede grabar y luego leer 10 caracteres de un archivo utilizando C++ Builder? Gracias.

cormac
21 de Septiembre del 2003
Muchas gracias, PEEEEEEEEERO. ¿No hay alguna forma tal y como me habeis dicho de que si tengo un archivo de texto grande ir grabando LINEA POR LINEA en un buffer o variable tipo string?????

Victor Ya?
21 de Septiembre del 2003
Para eso puedes usar fgets en vez de fscanf, este ejemplo lo saque de la ayuda de C++.

#include <string.h>
#include <stdio.h>

int main(void)
{
FILE *stream;
char string[] = "This is a test";
char msg[20];

/*Abre el archivo en modo de escritura para agregar */
stream = fopen("DUMMY.FIL", "w+");

/* escribe un string en el archivo */
fwrite(string, strlen(string), 1, stream);

/*busca el inicio del archivo */
fseek(stream, 0, SEEK_SET);

/* lee una cadena del archivo */
fgets(msg, strlen(string)+1, stream);

/* muestra la cadena*/

printf("%s", msg);

fclose(stream);
return 0;
}

y chan chan, listo!
Pasa por mi foro.-
_Viktor

seare
21 de Septiembre del 2003
no sé bien lo que quieres, pero tanto para grabar como para abrir puedes utilizar un Memo

Ejemplo para guardar:
Añade un Button, un Memo y un SaveDialog.
En el evento OnClick del Button escribe lo siguiente:
if(SaveDialog1->Execute())
Memo1->Lines->SaveToFile(SaveDialog1->FileName);

Para abrir añade otro Button y un OpenDialog:
if(OpenDialog1->Execute())
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);

Para acceder a la primera línea del memo y meterla en una variable por ejemplo, lo haces con:

AnsiString a = Memo1->Lines->Strings[0];

y para coger los primeros 10 caracteres de esa línea;

AnsiString b = a.SubString(1,10);

Donde el 1 es el caracter de la cadena a partir del cual extraemos la nueva cadena y 10 es el nº de caracteres que cogemos a partir de ahí.

Espero haberte ayudado.

Salu2.

Victor Ya?
21 de Septiembre del 2003
Hola podrias hacerlo de esta forma, asi solo lees lo justo y necesario.

#include <stdio.h>//fscanf//


void __fastcall TForm1::Button1Click(TObject *Sender)
{
TOpenDialog *Abrir = new TOpenDialog(Application);
FILE *fp;
char caracter;
String lineas="";
Abrir->DefaultExt="txt";
Memo1->Clear();
if(Abrir->Execute())
{
fp=fopen(Abrir->FileName.c_str(),"r" ) ;
for(int i=0;i<10;i++)
{
fscanf(fp,"%c",&caracter);
lineas+=String(caracter);
}
Memo1->Lines->Add(lineas);
fclose(fp);

}
delete Abrir;
}

Y finalmente haces en otro boton si quieres

Memo1->Lines->SaveToFile("ruta_destino");
Suerte!

seare
21 de Septiembre del 2003
Me gusta esa forma de hacerlo pero...
cuando pones

for(int i=0;i<10;i++)
{
fscanf(fp,"%c",&caracter);
lineas+=String(caracter);
}

no entiendo cómo vas pasando de caracter. no veo dónde influye i para avanzar caracteres a lo largo del archivo.

Espero que no sea mucho pedir, ¿podrías explicarme un poco el código que has puesto dentro del if (solo lo de entre las llaves)?

Estoy algo verde usando las funciones relativas a archivos (debería darme vergüenza!!!). Gracias de antemano.

Salu2

Victor Ya?
21 de Septiembre del 2003
Es super simple, mira:
Como tu problema radicaba en leer solo diez caracteres, el for repite la accion 10 veces
for(int i=0;i<10;i++)
{
//lee un caracter y lo almacena en "caracter", luego el puntero fp, avanza para leer la proxima letra en el ciclo que viene del for
fscanf(fp,"%c",&caracter);
//voy pegando todas las letras a la variable "lineas"
lineas+=String(caracter);
}
Asi finalmente la agrego como linea al memo.

Es eso, asi de simple.
Visita mi foro:
http://ayudacbuilder.foros.st/



seare
21 de Septiembre del 2003
OK, muchas gracias. Por lo que veo el puntero avanza automáticamente al siguiente caracter después de leer uno. Mmm, no sé si me explico bien, pero creo que lo he entendido. Algo así como cuando hacías un scanf en c y saltaba solo de línea, mientras que con printf siempre había que poner el n, supongo. Parece q me armo un cacao mental, jejeje, pero sí, creo que lo he entendido.

Ya que he dado la lata una vez, a ver si puede ser otra...
fscanf para leer, y ¿para escribir en un fichero? ¿y añadir algo a un fichero?

Evidentemente sé hacerlo a través de memos, pero me parece mucho más elegante y mejor programado hacerlo a través de las funciones falgo como fscanf y otras. Me llega que me digas q órdenes son. Después ya las estudio yo, que sería mucho morro pedirte explicación de todo.

Gracias.

Salu2

Victor Ya?
21 de Septiembre del 2003
seria fprintf
algo asi
FILE *fp = fopen("fichero.txt","w");//w de escritura

imagina que quieres escribir del uno al diez en el fichero. Seria asi

for(int i=0;i<10;i++)
fprintf(fp,"%dn",i+1);
Asi de simple.-

Visita mi foro
http://ayudacbuilder.foros.st/

seare
21 de Septiembre del 2003
Muchísimas gracias. Con eso voy más que servido.

Por cierto, menudas horas para andar programando! jejeje Buenas noches.

Victor Ya?
21 de Septiembre del 2003
;-)
En todo caso aca en chile no es ni medianoche todavia.
Saludos y pasa por mi foro.-