2012-04-01 36 views
0

我曾嘗試使用下面的代碼片斷:ifstream的在C++中不接受可變

int main() 
{ 
string location_file ("test.txt"); 
string data; 

ifstream file (location_file); 
getline (file, data); 
file.close(); 

cout << data; 
return 0; 
} 

但它不會工作。現在,如果我使用「ifstream文件(」test.txt「)」它會。爲什麼?最後它不是一回事嗎?

回答

2

的問題是,ifstream的構造不接受string作爲參數,但僅接受char const*。現"test.txt"類型char const[9]根據類型的促銷規則衰減到char const*,因此它的工作。但是,沒有從stringchar const*的隱式轉換,因此您的代碼不起作用。

要解決你的代碼,以構建你的流:

ifstream file(location_file.c_str()); 
+0

@pmr:關於你的編輯:包含初始化符*的聲明是一個定義(除少數例外,但這不是其中之一) – celtschk 2012-04-01 13:31:18

+0

Upvoted for the explanation。Did not know that。謝謝。 – MKII 2012-04-01 13:52:06

+0

@celtschk好的。這是否意味着定義在引用函數/ cl時有所不同驢的定義和何時用於名稱? – pmr 2012-04-01 13:55:57

5

因爲在早期版本的C++標準,有(不快)沒有構造函數ifstream是花了string,所以你要做的:

ifstream file(location_file.c_str()); 
+1

不莫名其妙地:當時的想法是不同的部分大多是相互獨立的,所以你可以在同一時間使用'fstream's無使用'string's。一個採用'string'的構造函數會將'fstream'和'string'耦合起來。這可能不是一個好決定(我認爲不是這樣),但它絕對不是無法解釋的。 – celtschk 2012-04-01 13:28:50

+0

@celtschk:有趣的。那麼,我會調整我的措辭...... – 2012-04-01 13:33:59

+0

另一種解釋是流很早以前就已經設計過,即使是std :: string也沒有做出決定。 – 2012-04-01 14:15:41