2014-02-09 37 views
2

我在這裏掙扎了一下,我有一些代碼類似於此:C++:如何請求一個文件名並打開它?

#include <iostream> 
#include <string> 
#include <ifstream> 

using namespace std; 

int main() { 
    string filename; 
    cout << "Enter the filename: "; 
    cin >> filename; 
    ifstream myfile(filename); 

    //code that does stuff, eg: 
    while (myfile >> thing) { 
     mydata[i] = thing; 
     i = i + 1; //etc, this *isn't* an issue 
    } 
} 

的主要問題是,它似乎並沒有與克至++編譯,但我敢肯定,之前我有這個工作。我讀的地方這是string filename;位是被打破了,但我不知道該怎麼要求比把它作爲一個string其他的文件名。誰能幫忙?我也應該使用<fstream><ifstream>我真的沒有看到區別。謝謝。

+4

'CIN >> >>名ENDL;'爲什麼你想推的東西'的std :: endl'? – Mat

+0

哦,呃,我不知道,那不是問題,那是我快速打字。 –

+0

如果'filename'包含空格,則使用'getline()'。 – herohuyongtao

回答

4

你需要克服的第一個錯誤是this one

main.cpp:3:20: fatal error: ifstream: No such file or directory 
#include <ifstream> 
        ^
compilation terminated. 

事實上,這個頭不存在。你的意思可能是fstream

一旦得到糾正,the crux of your issue is

main.cpp: In function 'int main()': 
main.cpp:11:29: error: no matching function for call to 'std::basic_ifstream<char>::basic_ifstream(std::string&)' 
    ifstream myfile(filename); 

這是因爲fstream構造函數,在C++ 98和C++ 03,沒有采取字符串參數。這是一種傳統的監督,在C++ 11中得到修復。

你有兩個選擇:

  • 切換到C++ 11(demo
  • 傳遞一個C風格的字符串,而不是(demo

    ifstream myfile(filename.c_str()); 
    

在上述兩個例子中,我必須刪除整個while循環,因爲它引用ces符號未在程序中聲明。當報告問題,請多加小心,並提出一個testcase包含只有你試圖解決的問題。

+0

好的,謝謝你回答我的問題。我不知道'.c_str()',所以這很有幫助。有關它做什麼的不同解釋? 另外,你說需要更多的照顧,但因爲我說這個問題是不是有我沒有提供完整的代碼,我知道那部分我的程序編譯正確,所以我不想分散與不相關的變量人這個問題,但我確實想展示我想要達到的目標。 –

+0

@captainjamie:由於人誰不知道爲什麼程序沒有編譯,你是沒有資格決定是什麼,是不相關的。另外,當我必須提取_definitely_無法編譯的代碼片段(因爲您沒有聲明所需的變量)時,它會使_my_生活更加困難,而對問題完全沒有任何影響。 –

+0

@captainjamie:'.c_str()'返回一個指向'std :: string'使用的內部'char'數組的指針。數據是一樣的,但你訪問它的方式是不同的。只是IOStreams只是在最近更新才直接使用'std :: string'。 –

4

如果你沒有C++ 11的支持,你需要一個const char*傳遞給ifstream構造。你可以這樣做是這樣的:

ifstream myfile(filename.c_str()); 
相關問題