Ayuda con ficheros y directorios en C++ usando Codeblocks

Iniciado por nadales56, 5 Marzo 2019, 12:35 PM

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

nadales56

Buenas tardes! Gracias de antemano por leer este post.

Les comento, estoy implementando un código relativamente sencillo que se trata de copiar el contenido de un fichero de texto en otro, en base al nombre del fichero de texto origen que se encuentra en el mismo directorio donde se encuentra el script que estoy programando.

Si quisiera recurrir a un fichero que se encuentra en un directorio diferente,
¿qué funciones puedo usar o... dónde me recomiendan buscar información?

Les hago copia y pega del main.
///////////////////////////////////////
int main(){

Codigo ok;
string entrada, salida;

entrada = "Fichero_Entrada.txt"; //Fichero de donde cojo los datos
salida = "Fichero_Salida.txt"; // Creo nuevo fichero con este nombre con los datos copiados de Fichero_Entrada

traspasar_fichero(salida, entrada, ok);
codigo_error(ok);

entrada = "Fichero_Salida.txt";
salida = "Datos_actualizados.txt";

actualizar_datos(salida, entrada, ok);
codigo_error(ok);

}
////////////////////////////////////////////

Muchas gracias!



K-YreX

Los códigos puedes (y debes :xD) meterlos entre etiquetas de código GeSHi, en lugar de delimitarlo con barras diagonales. Es más fácil de ver y no se producen problemas de etiquetas. Lo puedes seleccionar encima del cuadro de texto al escribir/modificar un mensaje.

Dicho esto, si lo que quieres es cambiar la ruta del fichero, simplemente añade la ruta al nombre del fichero.
  • Rutas en Linux
    Código (cpp) [Seleccionar]

    string nombre_entrada = "MisArchivos/Codigos/fichero_entrada.txt";
    string nombre_salida = "../fichero_salida.txt"; // ruta anterior a la actual


  • Rutas en Windows: si no me equivoco se separan con la diagonal al revés "\". Si me equivoco que alguien me corrija ya que no estoy del todo seguro de si las rutas son como en Linux o cambia algo más...
    Código (cpp) [Seleccionar]

    string nombre_entrada = "MisArchivos\Codigos\fichero_entrada.txt";


    Si quieres más información tendrías que buscar sobre como escribir la dirección o ruta de un archivo ya que eso es lo importante para lo que quieres hacer. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

nadales56

Muchas gracias YRex... para Windows no era así exactamente, pero con la pista que me has dado he acabado encontrándolo y funciona perfectamente.

Código (cpp) [Seleccionar]
string entrada = "C:\\""Carpeta_1""\\Carpeta_2""\\Carpeta_N""\\fichero_entrada.txt";


C++ toma \ como carácter de escape, por lo que hay que escribirlo doble \\ para separar las carpetas y cada una de ellas debe de tener sus respectivas comillas, tal y como he puesto en el ejemplo.

K-YreX

De todas formas me extraña que haya que usar doble barra ya que en ocasiones he visto rutas especificadas en un solo <string> :-X
Código (cpp) [Seleccionar]

string file_name = "d:\prueba.txt";
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

nadales56

#4
Buenas!
Siento ser tan pesado con el tema, pero quiero aprender bien al respecto.

Me he pasado a Ubuntu a través de una maquina virtual. De manera que el script lo escribo desde editor de texto y compilo desde el terminal.

El programa lo que hace es acceder a un fichero que se encuentra en la Carpeta_A y copiar su contenido en un nuevo fichero que se encontrará en la Carpeta_B, siendo la Carpeta_B el lugar donde tengo guardado el archivo cpp que estoy programando.

En el script tengo escrito esto:
Código (cpp) [Seleccionar]
string entrada = "Escritorio/Carpeta_A/Fichero_Origen.txt";
string salida = "Escritorio/Carpeta_B/Fichero_Destino.txt";


Y en el terminal he accedido a Escritorio/Carpeta_B, que es dónde se encuentra el archivo cpp, y para compilar hago:
g++ -o Nombre Archivo.cpp

Me compila y no da error alguno

y para ejecutar:

./Nombre

Pero no da resultado.


Decir también, que he probado copiando el Fichero_Origen en la Carpeta_B, que es donde se está trabajando, y en vez de poner rutas he puesto los nombres de los ficheros entre comillas con su respectiva terminación, y el programa hace lo que comento ahí arriba.
Lo hice para descartar que el error estuviese en el código.

Mis preguntas son:
1) ¿Están bién escritas las rutas en el script?
2) ¿Tengo que especificar en el terminal la ruta donde está el Fichero_Origen?
3) ¿He de usar alguna librería específica para trabajar con directorios?


Gracias de antenmano, un saludo.

K-YreX

#5
[code]ruta_absoluta = "/home/<tu_usuario>/Escritorio/fichero_prueba.txt"
Puedes ver la ruta absoluta en la que te encuentras en la terminal con el comando <pwd>.

No sé por qué mi mensaje empieza con una etiqueta de <code> que no puedo quitar... Este párrafo debería ir lo primero, pero para que no se confunda con un <code> lo dejo aquí... :rolleyes:
Primero el tema de las rutas. El sistema de archivos de Linux "cuelga" de la raíz (root) /. Podemos referirnos a un fichero usando una ruta absoluta o una ruta relativa:
  • Ruta absoluta: se especifica desde la raíz hasta el fichero que queremos hacer referencia.
    AQUÍ DEBERÍA IR EL PRIMER TROZO DE CÓDIGO QUE SE VE
  • Ruta relativa: se especifica desde el punto en el que te encuentras.
    En este caso puedes usar cosas como el punto (.) que referencia al lugar actual en el que te encuentras o los dos puntos (..) que referencia al directorio anterior al actual.

    // si estamos en /home/<tu_usuario>
    ruta_relativa = "./fichero_prueba.txt" // mismo fichero que en el ejemplo anterior
    // el punto se puede obviar si se quita tambien la barra diagonal
    ruta_relativa = "fichero_prueba.txt"
    // si pones la barra diagonal y no pones el punto, haces referencia a la raíz, entonces tendrás un problema

    // si buscamos un fichero que esta en una carpeta que esta en Documentos y nosotros estamos en Escritorio seria:
    ruta = "../Documentos/fichero.txt"
    // dos puntos para volver para atras porque estabamos en Escritorio y luego ya entramos en Documentos


    La dirección "/home/<tu_usuario> se puede abreviar con ~ (alt gr + 4)... :silbar:

    ruta1 = "/home/<tu_usuario>/Escritorio/Carpeta1/prueba.txt"
    ruta2 = "~/Escritorio/Carpeta1/prueba.txt"


    Puedes obtener más información buscando rutas de archivos en Linux o rutas relativas y absolutas. Y también puedes estudiar todo el sistema de archivos y poder localizar algunos de los directorios fundamentales del sistema y donde se encuentran. Suerte :-X[/code]


    Citar
    1) ¿Están bién escritas las rutas en el script?
    Si estás ejecutando el programa desde tu home (~) sí. En otro caso no, si usas una ruta relativa tienes que saber desde donde lo estás ejecutando para hacer bien la referencia. Si quieres que funcione desde cualquier sitio, usa una ruta absoluta (usando ~ te ahorras un trozo). De todos modos, por comodidad cuando sabes que todo se va a mover en conjunto o que no se va a mover, se suelen usar rutas relativas por comodidad.


    Citar
    2) ¿Tengo que especificar en el terminal la ruta donde está el Fichero_Origen?
    Siempre. Otra cosa es que si tanto el fichero como el ejecutable están en el mismo lugar, basta con el nombre del fichero, pero porque esa es su ruta relativa. ACLARO: Más que "donde esté el ejecutable" es "desde donde ejecutes el programa en la terminal".


    Citar
    3) ¿He de usar alguna librería específica para trabajar con directorios?
    Más que "para trabajar con directorios" es "para trabajar con ficheros" y has de incluir la librería <fstream> que el mismo nombre lo dice <file> + <stream>.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

nadales56

YreX-DwX, muchísimas gracias por el curro que te has dado tio!

Mucha información que procesar, una vez procesada la aplicaré y te diré que tal me va!
Gracias por la lección! ;)

nadales56

Escribo aquí el código que he usado para hacer referencia a las rutas donde tengo guardados los ficheros.

En primer lugar, nos ponemos en situación:
En Escritorio -> Carpeta_Origen -> Fichero_Origen.txt

Copiaremos el contenido de Fichero_Origen.txt en un nuevo fichero que denotaremos como Fichero_Destino.txt, que se guardará en:
Escritorio -> Carpeta_Destino

Decir también que nuestro script se encuentra en Escritorio -> Carpeta_Destino.

Lo que quiere decir, que en el terminal especifico que me encuentro en dicha ruta, escribiendo cd Escritorio + ENTER + cd Carpeta_Destino + ENTER

En este caso he usado la ruta relativa, por simplificar.


Código (cpp) [Seleccionar]

ruta_entrada = "../Carpeta_Origen/Fichero_Origen.txt";


Coloco .. para volver a Escritorio, ya que ejecutamos desde una carpeta que está en él (Carpeta_Destino) y luego concreto que quiero ir a Carpeta_Origen


Código (cpp) [Seleccionar]

ruta_salida = "Fichero_Destino.txt";


En este caso, ya me encuentro en la ruta que deseo (la misma donde he ejecutado el script), por lo que lo único que tengo que hacer es ponerle nombre al fichero que quiero crear con el contenido copiado, añadiendo su respectiva terminación


Esto no hubiese posible sin la ayuda y las explicaciones de YreX-DwX.
Un saludo!