2009-05-09 28 views
11

Voglio che l'utente mi dia il percorso completo in cui il file esiste e non solo il nome del file. Come posso aprire il file in questo modo?Aprire il file con il suo percorso completo in C++

E 'qualcosa di simile:

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

Questo non sembra funzionare.

+1

Come fai a sapere che non funziona? Certamente dovrebbe fare. –

+1

Che/dovrebbe essere un \ –

+2

@DanielEarwicker hai sbagliato, è giusto. Se si desidera comunque convertirlo, è necessario convertirlo in \\ not \ –

risposta

10

È possibile utilizzare un percorso completo con le classi fstream. Il seguente codice tenta di aprire il file demo.txt nella directory principale dell'unità C :. Si noti che poiché si tratta di un'operazione di input, il file deve già esistere.

#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; 
    } 
} 

Che cosa produce questo codice sul sistema?

14

Normalmente si utilizza il carattere barra rovesciata come separatore di percorso in Windows. Quindi:

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

Tenere presente che quando scritto in codice sorgente C++, è necessario utilizzare la doppia barra rovesciata perché il carattere di backslash sé significa qualcosa di speciale dentro doppie stringhe tra virgolette. Quindi quanto sopra si riferisce al file C:\Demo.txt.

+0

Tutti i compilatori di Windows di cui sono a conoscenza supportano l'uso della barra in avanti nei nomi dei file e dovrebbero essere usati preferibilmente rispetto alla barra retroversa per la portabilità . –

+11

Win32 supporta "\" o "/" per i percorsi, a meno che non si superi la canonizzazione del percorso (percorsi che iniziano con "\\? \"). Vedi http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx – Richard

+2

Neil, questo non ha nulla a che fare con il compilatore. La shell di Windows tratta le barre in avanti allo stesso modo delle barre posteriori. Questo è stato il caso sin dai primi giorni di NT. – shoosh

2

Il codice sembra funzionare per me. Penso lo stesso con @ Iothar.

Verificare se si includono le intestazioni richieste, da compilare. Se è compilato, controlla se c'è un tale file, e tutto, nomi ecc., Corrisponde, e controlla anche di vedere che hai il diritto di leggere il file.

Per effettuare una controllo incrociato, verificare se è possibile aprire con fopen ..

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

Per coloro che sono sempre il percorso dynamicly ... per esempio trascinamento & goccia:

Alcune costruzioni principali ottengono trascinare & sceso depositare presso le doppie virgolette come:

"C:\MyPath\MyFile.txt" 

Soluzione rapida e piacevole è quello di utilizzare questa funzione per rimuovere caratteri dalla stringa:

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 ora contiene solo C:\MyPath\MyFile.txt

La funzione richiede queste librerie: <iostream><algorithm><cstring>.
La funzione era basata su this answer.

lavoro Fiddle:http://ideone.com/XOROjq

Problemi correlati