[Solucionado] comprobar si el fichero existe, variable tipo string

Iniciado por tonilogar, 8 Junio 2011, 23:28 PM

0 Miembros y 1 Visitante están viendo este tema.

tonilogar

En esta aplicación, entro un dato con  getline  y utilizo el tipo de variable string por si el nombre tiene espacios.

Hay alguna forma de detectar si el fichero existe o no, con una variable del tipo string.

Parecido a como se hace con el variables de tipo char*.



Código (cpp) [Seleccionar]

int main ()

{

 char * Imagen;

 int com;

   cout <<  endl;

   cout <<  endl;

   cout << "selecciona imatge a transformar";

   cout <<  endl;

   cout <<  endl;

   cin >> Imagen;

   cout <<  endl;



cout <<  Imagen;

   ifstream fich (Imagen, ios::in | ios::binary);

   com=(fich.good());

   cout <<  endl;



   if (com==0) cout <<  "La imagen no existe";

   else cout <<  "La imagen existe";

   cin.get();

}




O con el open de ifstream



Un saludo a todos y gracias por vuestra ayuda.
No porque discrepe de tu opinión intento ofenderte.

Un saludo a todos y gracias por vuestro tiempo.

Don Pollo

No creo que haya forma de saber si el fichero se ha abierto bien con una variable string pero, tengo una duda de tu código: por qué pones endl's antes y después del cin? si lo que este comando haga no lo muestra por pantalla

fantasma306

Si tu archivo es binario, ya no se trata de ifstream ni de ofstream. solo tienes que poner fstream:
   fstream fich (Imagen, ios::in | ios::binary);

Lo que puedes hacer es intentar abrir el archivo en lectura, y despues comprobar si esta abierto. (si no esta abierto no existe y si esta abierto no te olvides de cerrarlo)

Código (cpp) [Seleccionar]
string nomImagen;
cout <<  "\n\nselecciona imagen a transformar\n\n";

cin.clear();
cin.sync();
getline(cin,nomImagen);

cout<<nomImagen<<endl;

fstream archivo(nomImagen.c_str() , ios_base::in | ios_base::binary);
if(archivo.is_open()){
cout<<"El archivo existe"<<endl;
archivo.close();
}
else
cout<<"El archivo no se ha abierto";//podriamos decir que no existe


si el codigo es solo para windows hecha un vistazo a esto:
http://www.latindevelopers.com/forum/verificar-si-un-archivo-existe-t3102.html

saludos
Es mejor callar y que piensen que eres idiota a hablar y demostrarlo.

Died


#include <stdio.h>

int main (int argc, char *argv [])
{
printf ("Looker2Files 0.1 : Sagrini11: elhacker.NET\n");
if (argc != 2)
{
printf ("Use: %s <file2look>\n\n", argv [0]);
return 1;
}

int fd;
if ((fd = fopen (argv [1], "r"))!=-1)
{
printf ("File %s is here\n\n", argv [1]);
return 0;
}
printf ("File %s is not here\n\n", argv [1]);
return 1;
}



Esperemos que lo entiendas :)
Un saludo. Sagrini

tonilogar

El  cout <<  endl; detras del cin es porque despues se imprime la variable Imagen y lo veo mas claro.
Pero bueno como comentas en el código final no sirve para nada.

En principio lo he solucionado con el fstream
Código (cpp) [Seleccionar]

void ImagenEntrada()
{
std::cin.ignore();

//VARIABLES DE FUNCION/////////////////////////////////////////////////////////////////////////
std::string Imagen;


do
{
cout << "entra datos";
cout << endl<< endl;

getline (cin,Imagen);
const char *ImagenChar=Imagen.c_str();
fstream fichero(ImagenChar, ifstream::in);
    if (!fichero)
    {
       cout << "L'imatge a transformar no es correcta" << endl;

    }
   /* else if(fichero<1)
    {
       cout << "Fin entrada de Imagenes" << endl;
    }*/
    else
    {
      cout << "OK" << endl;
    }

}
while (Imagen.length()!=0);
cout << endl<< endl;
}

Fantasma306 probare como me indicas, para ver que solución es la que mas me conviene.
En principio es para windows, pero en casa utilizo linux y prefiero que el código sea portable.


Pues como de primeras no entiendo mucho Died, pero me lo mirare con detenimiento (soy un novato).

Si veis alguna pega sobre la solución que he utilizado no dejéis de criticar todo lo criticable.

Un saludo y gracias por vuestro tiempo.






No porque discrepe de tu opinión intento ofenderte.

Un saludo a todos y gracias por vuestro tiempo.

fantasma306

bueno solo decirte que no hace falta que pongas
std::
ya que creo que tienes puesto el using namespace std;

tampoco hace falta que hagas esto:
const char *ImagenChar=Imagen.c_str();
con que pongas,
fstream fichero(Imagen.c_str(), ifstream::in); ya esta, asi te ahorras variables. (es una de mis manias!  ;D)

una ultima cosa, no te olvides de cerrar el archivo en el ELSE  ;)

saludos!


Es mejor callar y que piensen que eres idiota a hablar y demostrarlo.

tonilogar

Gracias por tu ayuda fantasma306, este fin de semana intentare limpiar el código.
No porque discrepe de tu opinión intento ofenderte.

Un saludo a todos y gracias por vuestro tiempo.

tonilogar

Gracias por tu ayuda fantasma306.

Al  final he seguido todas tus indicaciones, utilizando el open y sin crear una variable nueva.
Así queda el código:


Código (cpp) [Seleccionar]


void ImagenEntrada()
{
cin.ignore();

//VARIABLES DE FUNCION/////////////////////////////////////////////////////////////////////////
string Imagen;


do
{
cout << "entra datos";
cout << endl<< endl;

getline (cin,Imagen);
fstream fichero(Imagen.c_str(), ios_base::in | ios_base::binary);
    if (fichero.is_open())
    {
       cout << "el fichero existe" << endl;
       fichero.close();

    }
   else if (Imagen.length()==0)
   {
      cout << "OK" << endl;
    }

    else
    {
      cout << "El fichero no existe" << endl;
    }

}
while (Imagen.length()!=0);
cout << endl<< endl;
}


Un saludo.
No porque discrepe de tu opinión intento ofenderte.

Un saludo a todos y gracias por vuestro tiempo.