Escribir un archivo en una ruta específica en C ++

Tengo este código que escribe con éxito un archivo:

ofstream outfile (path); outfile.write(buffer,size); outfile.flush(); outfile.close(); 

el búfer y el tamaño están bien en el rest del código. ¿Cómo es posible poner el archivo en una ruta específica?

Especifique la ruta completa en el constructor de la ruta, esta puede ser una ruta absoluta o una ruta relativa. (relativo a donde se ejecuta el progtwig).

El destructor de secuencias cierra el archivo por usted, los cierres explícitos son MÁS probables de introducir errores (escribir después de que el archivo está cerca).

 #include  #include  int main() { const char *path="/home/user/file.txt"; std::ofstream file(path); //open in constructor std::string data("data to write to file"); file << data; }//file destructor 

Tenga en cuenta que puede usar std :: string en el constructor de archivos en C ++ 11 y es preferible a const char * en la mayoría de los casos.

Justificación para publicar otra respuesta

Estoy publicando porque ninguna de las otras respuestas cubre el espacio del problema.

La respuesta a tu pregunta depende de cómo obtengas el camino. Si está construyendo el camino completamente dentro de su aplicación, entonces vea la respuesta de @James Kanze. Sin embargo, si está leyendo la ruta o los componentes de la ruta desde el entorno en el que se ejecuta su progtwig (por ejemplo, variable de entorno, línea de comandos, archivos de configuración, etc.), entonces la solución es diferente. Para entender por qué, necesitamos definir qué es un camino.

Visión general rápida de las rutas

En los sistemas operativos (que conozco), una ruta es una cadena que se ajusta a un mini lenguaje especificado por el sistema operativo y el sistema de archivos (sistema para abreviar). Las rutas se pueden suministrar a las funciones IO en un sistema dado para acceder a algún recurso. Por ejemplo, aquí hay algunas rutas que puede encontrar en Windows:

 \file.txt \\bob\admin$\file.txt C:..\file.txt \\?\C:\file.txt .././file.txt \\.\PhysicalDisk1\bob.txt \\;WebDavRedirector\bob.com\xyz C:\PROGRA~1\bob.txt .\A:B 

Resolviendo el problema a través de la manipulación del camino

Imagine la siguiente situación: su progtwig admite un argumento de línea de comando, --output-path= , que permite a los usuarios proporcionar una ruta en la que su progtwig debería crear archivos de salida. Una solución para crear archivos en el directorio especificado sería:

  1. Analice la ruta especificada por el usuario en función del mini idioma del sistema en el que está operando.
  2. Cree una nueva ruta en el minilenguaje que especifica la ubicación correcta para escribir el archivo utilizando el nombre de archivo y la información que analizó en el paso 1.
  3. Abra el archivo usando la ruta generada en el paso 2.

Un ejemplo de hacer esto:

En Linux, supongamos que el usuario ha especificado --output-path=/dir1/dir2

Parse este mini-lenguaje:

 /dir1/dir2 --> "/" root --> "dir1" directory under root --> "/" path seperator --> "dir2" directory under dir1 

Luego, cuando queremos generar un archivo en el directorio especificado, creamos una nueva ruta. Por ejemplo, si queremos generar un archivo llamado bob.txt , podemos construir la siguiente ruta:

 /dir1/dir2/bob.txt --> "/" root --> "dir1" directory under root --> "/" path separator --> "dir2" directory under dir1 --> "/" path seperator --> "bob.txt" file in directory dir2 

Entonces podemos usar esta nueva ruta para crear el archivo.

En general, es imposible implementar esta solución por completo. Incluso si pudiera escribir código que pudiera decodificar con éxito todos los mini-idiomas de ruta existentes y representar correctamente la información sobre cada sistema para que una nueva ruta pueda construirse correctamente: en el futuro su progtwig puede construirse o ejecutarse en sistemas nuevos que tengan nuevos mini-idiomas de ruta que su progtwig no puede manejar. Por lo tanto, debemos usar una estrategia cuidadosa para administrar las rutas.

Estrategias de manejo de ruta

1. Evite la manipulación de la ruta por completo

No intente manipular las rutas que ingresan a su progtwig. Debe pasar estas cadenas directamente a las funciones de API que pueden manejarlas correctamente. Esto significa que debe utilizar las API específicas del sistema operativo para evitar directamente las abstracciones de IO de los archivos de C ++ (o debe estar absolutamente seguro de cómo se implementan estas abstracciones en cada sistema operativo). Asegúrese de diseñar la interfaz de su progtwig cuidadosamente para evitar una situación en la que se vea forzado a manipular las rutas. Intenta implementar los algoritmos para que tu progtwig también evite la necesidad de manipular rutas. Documente las funciones api que utiliza su progtwig en cada sistema operativo para el usuario; esto se debe a que las funciones api del sistema operativo se vuelven obsoletas con el tiempo, por lo que su progtwig podría no ser compatible con todas las rutas posibles, incluso si evita manipular la ruta.

2. Documente las funciones que su progtwig usa para manipular las rutas

Documentar al usuario exactamente cómo se manipularán las rutas. Luego, deje en claro que es responsabilidad del usuario especificar rutas que funcionen correctamente con el comportamiento documentado del progtwig.

3. Solo admite un conjunto restringido de rutas

Restrinja los mini-idiomas de ruta que su progtwig aceptará hasta que esté seguro de que puede manipular correctamente el subconjunto de rutas que cumplen con este conjunto de restricciones. Documentar esto para el usuario. Error si se ingresan rutas que no se ajustan.

4. Ignora los problemas

Haz alguna manipulación básica del camino sin preocuparte demasiado. Acepte que su progtwig exhibirá un comportamiento indefinido para algunos de los caminos que se ingresan. Podría documentar al usuario que el progtwig puede funcionar o no cuando le ingresen las rutas, y que son los usuarios quienes deben asegurarse de que el progtwig haya manejado las rutas de entrada correctamente. Sin embargo, tampoco puedes documentar nada. Los usuarios generalmente esperan que su progtwig no maneje algunas rutas correctamente (muchas no) y por lo tanto, funcionará bien incluso sin documentación.

Pensamientos de cierre

Es importante decidir una estrategia efectiva para trabajar con las rutas desde el principio en el ciclo de vida de su progtwig. Si tiene que cambiar la forma en que se manejan las rutas más tarde, puede ser difícil evitar un cambio en el comportamiento que pueda romper su progtwig para los usuarios existentes.

Eso debe hacerse cuando abre el archivo, vea std::ofstream constructor o open() miembro.

No está muy claro lo que estás preguntando; si entiendo correctamente, se le da un nombre de archivo y desea crear el archivo en un directorio específico. Si ese es el caso, todo lo que es necesario es especificar la ruta completa al constructor de ofstream . Puede usar la concatenación de cadenas para construir esta ruta, pero recomiendo boost::filesystem::path . Tiene todas las funciones para hacer esto de manera portátil, y mucho más; de lo contrario, no será portátil (sin mucho esfuerzo), e incluso las operaciones simples en el nombre de archivo requerirán bastante reflexión.

Estuve atascado en esto por un tiempo y desde entonces lo he descubierto. La ruta se basa en donde está el ejecutable y varía un poco. Para este ejemplo supongamos que hace un ls mientras está en su directorio ejecutable y mira:

 myprogram.out Saves 

Where Saves es una carpeta y myprogram.out es el progtwig que está ejecutando.

En su código, si está convirtiendo caracteres en un c_str() de la siguiente manera:

 string file; getline(cin, file, '\n'); ifstream thefile; thefile.open( ("Saves/" + file + ".txt").c_str() ); 

y el usuario escribe en savefile, sería

 "Saves/savefile.txt" 

que trabajará para llegar a savefile.txt en su carpeta de Guardar. Tenga en cuenta que no hay barras diagonales predeterminadas y que acaba de comenzar con el nombre de la carpeta.

Sin embargo, si está utilizando una cadena literal como

 ifstream thefile; thefile.open("./Saves/savefile.txt"); 

sería así para llegar a la misma carpeta:

 "./Saves/savefile.txt" 

Observe que comienza con un ./ delante del nombre de la carpeta.

Prueba esto:

 ofstream outfile; string createFile = ""; string path="/FULL_PATH"; createFile = path.as() + "/" + "SAMPLE_FILENAME" + ".txt"; outfile.open(createFile.c_str()); outfile.close(); //It works like a charm. 

Si está utilizando Linux, pruebe execl (), con el comando mv.