2009-05-09 65 views
11

Tôi muốn người dùng cung cấp cho tôi đường dẫn đầy đủ nơi tệp tồn tại và không chỉ tên tệp. Làm cách nào để mở tệp theo cách này?Mở tệp theo đường dẫn đầy đủ của nó trong C++

Có một cái gì đó như thế này:

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

này dường như không làm việc.

+1

Làm sao anh biết nó không hoạt động? Nó chắc chắn nên làm. –

+1

Đó/phải là \ –

+2

@DanielEarwicker bạn sai, điều đó đúng. Nếu bạn vẫn muốn chuyển đổi nó thành \\ không \ –

Trả lời

10

Bạn có thể sử dụng đường dẫn đầy đủ với các lớp fstream. Mã folowing cố mở tập tin demo.txt trong thư mục gốc của ổ C :. Lưu ý rằng vì đây là một thao tác nhập, tệp phải tồn tại.

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

Mã này tạo ra trên hệ thống của bạn là gì?

14

Thông thường, một ký tự sử dụng ký tự gạch chéo làm dấu tách đường dẫn trong Windows. Vì vậy:

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

Hãy ghi nhớ rằng khi viết bằng C++ mã nguồn, bạn phải sử dụng dấu chéo ngược đôi vì nhân vật xuyệc ngược bản thân có nghĩa là một cái gì đó đặc biệt trong chuỗi trích dẫn kép. Vì vậy, ở trên đề cập đến tệp C:\Demo.txt.

+0

Tất cả các trình biên dịch cửa sổ mà tôi biết hỗ trợ việc sử dụng dấu gạch chéo chuyển tiếp trong tên tệp và nó nên được sử dụng tùy theo dấu gạch chéo ngược cho tính di động . –

+11

Win32 hỗ trợ hoặc là "\" hoặc "/" cho đường dẫn, trừ khi bạn đang bỏ qua đường dẫn canonicalisation (đường dẫn bắt đầu bằng "\\? \"). Xem http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx – Richard

+2

Neil, điều này không liên quan gì đến trình biên dịch. Các cửa sổ shell xử lý về phía trước slashes giống như cách slashes trở lại. Đây là trường hợp kể từ những ngày đầu của NT. – shoosh

2

Mã này có vẻ hoạt động với tôi. Tôi nghĩ tương tự với @Iothar.

Kiểm tra xem bạn có bao gồm các tiêu đề bắt buộc không, để biên dịch. Nếu nó được biên soạn, hãy kiểm tra xem liệu có một tệp như vậy và mọi thứ, tên, v.v., và cũng kiểm tra xem bạn có quyền đọc tệp hay không.

Để thực hiện một kiểm tra chéo, kiểm tra xem bạn có thể mở nó bằng fopen ..

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

Đối với những người đang nhận được con đường dynamicly ... ví dụ kéo & thả:

Một số công trình xây dựng chính được kéo & giảm nộp với dấu ngoặc kép như:

"C:\MyPath\MyFile.txt" 

giải pháp nhanh chóng và tốt đẹp là để sử dụng chức năng này để loại bỏ ký tự từ chuỗi:

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 hiện chỉ chứa C:\MyPath\MyFile.txt

Chức năng cần các thư viện này: <iostream><algorithm><cstring>.
Chức năng được dựa trên this answer.

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

Các vấn đề liên quan