2009-05-09 16 views
11

Quiero que el usuario me proporcione la ruta completa donde existe el archivo y no solo el nombre del archivo. ¿Cómo abro el archivo de esta manera?Abrir archivo por su ruta completa en C++

¿Es algo como esto:

ifstream file; 
file.open("C:/Demo.txt", ios::in); 

no parece que esto funcione.

+1

¿Cómo sabe que no funciona? Ciertamente debería hacer. –

+1

Eso/debería ser un \ –

+2

@DanielEarwicker estás equivocado, es correcto. Si desea convertirlo de todos modos, debe convertirlo a \\ not \ –

Respuesta

10

Puede usar una ruta completa con las clases de flujo. El siguiente código intenta abrir el archivo demo.txt en la raíz de la unidad C :. Tenga en cuenta que como esta es una operación de entrada, el archivo ya debe existir.

#include <fstream> 
#include <iostream> 
using namespace std; 

int main() { 
    ifstream ifs("c:/demo.txt");  // note no mode needed 
    if (! ifs.is_open()) {     
     cout <<" Failed to open" << endl; 
    } 
    else { 
     cout <<"Opened OK" << endl; 
    } 
} 

¿Qué produce este código en su sistema?

14

Normalmente, uno usa el carácter de barra diagonal inversa como el separador de ruta en Windows. Por lo tanto:

ifstream file; 
file.open("C:\\Demo.txt", ios::in); 

Tenga en cuenta que cuando se escribe código fuente en C++, debe utilizar la doble barra invertida debido a la propia barra invertida significa algo especial dentro de cadenas entre comillas dobles. Entonces, lo anterior se refiere al archivo C:\Demo.txt.

+0

Todos los compiladores de Windows que conozco admiten el uso de la barra diagonal en los nombres de los archivos, y debe utilizarse con preferencia a la barra diagonal inversa para la portabilidad . –

+11

Win32 admite "\" o "/" para las rutas, a menos que esté pasando por alto la canonicalización de ruta (rutas que comienzan con "\\? \"). Ver http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx – Richard

+2

Neil, esto no tiene nada que ver con el compilador. El shell de Windows trata las barras diagonales de la misma manera que las barras diagonales inversas. Este ha sido el caso desde los primeros días de NT. – shoosh

2

El código parece funcionar para mí. Creo lo mismo con @Iothar.

Compruebe si incluye los encabezados necesarios para compilar. Si está compilado, verifique si existe dicho archivo, y todo, nombres, etc. coinciden, y también verifique que tenga derecho a leer el archivo.

Para realizar una verificación cruzada, comprobar si se puede abrir con fopen ..

FILE *f = fopen("C:/Demo.txt", "r"); 
if (f) 
    printf("fopen success\n"); 
1

Para aquellos que están recibiendo el camino dynamicly ... por ejemplo, arrastre & caída:

Algunas construcciones principales consiguen arrastrar & cayó presentar con comillas dobles como:

"C:\MyPath\MyFile.txt" 

solución rápida y agradable es utilizar esta función para eliminar los caracteres de la cadena:

void removeCharsFromString(string &str, char* charsToRemove) { 
    for (unsigned int i = 0; i < strlen(charsToRemove); ++i) { 
     str.erase(remove(str.begin(), str.end(), charsToRemove[i]), str.end()); 
    } 
} 

string myAbsolutepath; //fill with your absolute path 
removeCharsFromString(myAbsolutepath, "\""); 

myAbsolutepath ahora contiene solo C:\MyPath\MyFile.txt

La función necesita estas bibliotecas: <iostream><algorithm><cstring>.
La función se basó en this answer.

violín de Trabajo:http://ideone.com/XOROjq

Cuestiones relacionadas