Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Ficheros de texto !!! (https://www.clubdelphi.com/foros/showthread.php?t=66379)

Ledian_Fdez 16-02-2010 21:14:55

Ficheros de texto !!!
 
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.

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:
Cita:

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:
Código:

#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í:
Código:

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

Cita:

Empezado por Ñuño Martínez (Mensaje 354136)

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

Código:

#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.


La franja horaria es GMT +2. Ahora son las 12:12:57.

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