PDA

Ver la Versión Completa : Ficheros de texto !!!


Ledian_Fdez
16-02-2010, 21:14:55
Hola amigos de este foro y disculpa mi insistencia.

Es que soy nuevo progrando en C++, y todo lo trato de comparar con Delphi que es en lo que mas he trabajado.

Me pudieran dar alguna ayuda con este código.

#include <stdio.h>
.
.
.

FILE *fichero;
String Host, User, Pass;
fichero= fopen("C:\\conect.dll", "r");
if (fichero!= NULL)
{
fscanf (fichero, "%s", Host);
fscanf (fichero, "%s", User);
fscanf (fichero, "%s", Pass);
}
else ShowMessage("El archivo de conexion no se pudo abrir");
fclose(fichero);

Al ejecutar me da el siguiente error:
Access violation at address 326641F8 in module 'CC3260MT.DLL'. Write of address 00000000.

El fichero contiene lo siguiente:
SERVER1
Pepe
mayo81

Salu2,
Ledian.

Ñuño Martínez
16-02-2010, 23:19:15
La verdad es que comparar C++ con Object Pascal... ¡Buf! Son dos filosofías muy diferentes, a pesar de sus similitudes.

Por ejemplo, el error se produce porque String es una clase de objeto mientras que fscanf trabaja con punteros a char, no con objetos String.

Es decir: estas mezclando C++ con C, y aunque no lo parezca, son dos lenguajes muy diferentes (mucho más que Pascal y Object Pascal) y no se llevan muy bien.

Deberías buscar un buen libro de programación C o de C++. Te recomiendo al autor Herbert Schild.

De todas formas, una posible solución sería:
#include <stdio.h>
.
.
.

FILE *fichero;
char Host[MAX], User[MAX], Pass[MAX];
fichero= fopen("C:\\conect.dll", "r");
if (fichero!= NULL)
{
fscanf (fichero, "%s", &Host);
fscanf (fichero, "%s", &User);
fscanf (fichero, "%s", &Pass);
}
else ShowMessage("El archivo de conexion no se pudo abrir");
fclose(fichero);

De todas formas usar fscanf en este caso... Mejor fgets.

Otra solución sería con streams, pero nunca he trabajado con ellas en C++ así que no puedo ponerte un ejemplo.

_cero_
16-02-2010, 23:28:34
Si intentas cargar un simple fichero de texto y estas en C++, ps podrías usar el objeto “TStringList”
Más o menos seria así:

String Host, User, Pass;

TStringList* liss=new TStringList;
liss->LoadFromFile("c:\\mi archivo.txt");
Host=liss->Strings[0]; //suponiendo que Host es la primera línea del txt
User=liss->Strings[1]; //suponiendo que User es la segunda línea del txt
Pass=liss->Strings[2]; //suponiendo que Pass es la tercera línea del txt
delete liss;


Si lo que quieres es guardar configuraciones, pues búscale un rato sobre archivos ini (TIniFile), y/o edición del registro (TRegistry), de windows.

escafandra
17-02-2010, 00:43:19
Otra solución sería con streams, pero nunca he trabajado con ellas en C++ así que no puedo ponerte un ejemplo.

#include <fstream.h>
char Host[256];
char User[256];
char Pass[256];

fstream fs("c:\\conect.dll", ios::in);
fs.getline(Host, sizeof(Host));
fs.getline(User, sizeof(User));
fs.getline(Pass, sizeof(Pass));

Saludos.

Ñuño Martínez
17-02-2010, 09:06:06
Gracias escafandra. :)

Por cierto, Ledian_Fdez, que voy a hacerte una recomendación para gestionar los errores. Ya que C++ dispone de un sistema de excepciones similar al de Object Pascal te recomiendo que lo uses. Es decir, cuando detecta el error ("fichero == NULL") que lance una excepción y pon un "try { ... } catch (...) { ... }" en el main para mostrarlo.