2015-09-18 25 views
5

Có ai biết tại sao tệp không mở được không? Tôi cũng đã thử chỉ cần đặt "infile.txt" và đặt nó trong thư mục của chương trình và cũng là thư mục gỡ lỗi nhưng cách tôi sử dụng để kiểm tra lỗi mở cả hai kích hoạt có nghĩa là nó không thể mở. Tôi biết tôi có thể mã hóa vị trí nhưng tôi không muốn.Làm cách nào để mở tệp đầu vào, C++ trên cộng đồng studio trực quan 2015?

Tôi nghe nói bạn nên làm stringobj.c_str() nhưng tôi không biết liệu điều đó có chính xác không?

#include "stdafx.h" 

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

int main() 
{ 
    ifstream infile; 
    ofstream outfile; 

    string fileloc = "infile.txt"; 

    infile.open(fileloc); 


    if (!infile) 
    { 
     cout << "open fail 1" << endl; 
    } 

    bool fail = infile.fail(); 
    if (fail) 
    { 
     cout << "open fail 2"; 
    } 

    return 0; 
} 
+0

Đặt tập tin trong thư mục trong Debugging > Thư mục làm việc. –

Trả lời

4

Lưu ý rằng cấu trúc thư mục (ít nhất là cho VS2013) là

<base> 
    - Solution Directory 
    - Debug 
    - Release 
    - Project Directory 
     - Debug 
     - Release 

Chương trình bằng cách chạy mặc định trong thư mục dự án (mặc dù nó được xây dựng vào dung dịch/thư mục debug).

Nếu bạn chấp nhận mặc định quy ước đặt tên khi bắt đầu dự án của bạn, bạn nên đặt tập tin của bạn trong thư mục "Dự án \ ConsoleApplication1 \ ConsoleApplication1", không phải "Dự án \ ConsoleApplication1"

+0

Điều đó đã sửa nó! Cảm ơn đã giúp đỡ – user3822749

1

với

string fileloc = "infile.txt"; 

nếu bạn đặt infile.txt trong cùng một thư mục của tập tin cpp, nó phải là tốt.

btw Tôi xóa dòng đầu tiên của bạn

#include "stdafx.h" 

tôi sử dụng giao diện điều khiển Cygwin, có thể có diff nhỏ

+2

Vị trí của tệp cpp và tệp thực thi kết quả và thư mục làm việc của tệp thi hành là những điều độc lập. –

2

Kiểm tra thư mục làm việc của bạn trong Cài đặt Project -> Debugging. Đặt tệp của bạn ở đó.

2

Thứ nhất, tài liệu cho chữ ký của

std::ifstream::open(const char * filename, ios_base::openmode mode=ios_base::in) 

không chỉ ra nó đòi hỏi một char * const, chính xác những gì std :: string :: c_str() cung cấp. Tuy nhiên, có một quá tải cho mở mà chấp nhận một const str &, có nghĩa là nó hoạt động theo cùng một cách cho cả hai trên hầu hết các triển khai.

Nếu không, những gì bạn đang vật lộn với được gọi là thư mục làm việc hiện tại (hoặc cwd). Rõ ràng bạn không chắc chắn nơi thư mục THAT được. Nó có thể khác nhau trong khi bạn chạy trình gỡ lỗi trên Visual Studio hơn là khi bạn chạy chương trình của bạn từ dòng lệnh, và nó có thể khác nhau trong các IDE khác nhau.

Tôi không chắc chắn lý do tại sao bạn muốn đảm bảo chương trình của bạn chỉ mở một tập tin có tên trong thư mục hiện hành, và không đưa ra đường dẫn đầy đủ, nhưng ...

Bạn có thể muốn tìm hiểu những gì hiện tại thư mục làm việc là, vì vậy bạn có thể giải quyết các bí ẩn bất cứ nơi nào bạn thử điều này. Trong Visual Studio 2015 của tôi, thư mục kết thúc lên là thư mục ABOVE debug, nhưng điều đó phụ thuộc hoàn toàn vào cách dự án của bạn được cấu hình, và chúng ta không thể thấy điều đó ở đây.

Vì vậy, hãy thử:

std::string cwd = getcwd(NULL, 0); 

Điều này đòi hỏi một tiêu đề <direct.h> trên Windows trong Visual Studio, nhưng nó sẽ cung cấp cho bạn các thư mục mà bạn đang cố gắng tìm ra.

+0

Tại sao bạn muốn mã hóa đường dẫn tuyệt đối của tệp tài nguyên? –

+0

Không chắc chắn nếu bạn trả lời đúng câu trả lời, nhưng trong câu trả lời tôi đưa ra, đường dẫn tuyệt đối của tệp tài nguyên không được mã hóa cứng. Thật vậy, OP không muốn mã cứng đường dẫn, nhưng trong câu hỏi của tôi về điểm đó tôi đã không hỏi tại sao OP không muốn mã cứng đường dẫn đầy đủ, chỉ cần tại sao không chỉ định đường dẫn đầy đủ. Sử dụng hàm getcwd sẽ cho phép một thời trang có đường dẫn đầy đủ dựa trên cwd, mà OP gặp khó khăn trong việc tìm kiếm, dẫn đến tùy chọn hiển thị lỗi với đường dẫn đầy đủ đó. – JVene

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