2010-10-24 134 views
2

我想要做的是讀取名爲「test.txt」的文件,然後將文件的內容設置爲類型const char *。如何做到這一點?fstream to const char *

+0

你確定你需要一個'爲const char *'?如果你需要傳入一個需要'const char *'的函數,那麼你可以傳入'char *',如果這對你更方便的話。 – 2010-10-24 20:18:40

+0

可能的重複[什麼是在C++中將文件sl成std :: string的最佳方式?](http://stackoverflow.com/questions/116038/what-is-the-best-way-to-slurp -a-file-into-a-stdstring-in-c) – 2010-10-24 20:19:39

回答

5
#include <string> 
#include <fstream> 

int main() 
{ 
    std::string line,text; 
    std::ifstream in("test.txt"); 
    while(std::getline(in, line)) 
    { 
     text += line + "\n"; 
    } 
    const char* data = text.c_str(); 
} 

要小心,不要顯式調用刪除數據

+0

會'std :: string text; std :: getline(in,text,EOF); const char * data = text.c_str();'工作更快? – 2012-07-05 23:11:42

+0

我打算添加另一個使用sstream而不是字符串的解決方案,但我通過eq-找到了解決方案,我強烈建議您使用這個解決方案,因爲它在這裏分配和釋放每行內存時效率更高。 – 2017-07-04 16:16:19

1

您需要:

  1. 創建一個函數返回一個const char *
  2. 打開該文件的fstream
  3. 尋求結束
  4. 通過查看文件位置確定文件長度(tell
  5. 尋求回到開頭
  6. 創建一個char *包含文件內容
  7. 讀取文件內容流入焦炭*
  8. 回報的char *指針,用函數返回加上const的
  9. 該文件由fstream的走出去的範圍
2

自動關閉,這是極不可能你真的想這樣做。該文件的內容(可能是文本或二進制數據)不可能表示指向構架上的字符的(有效)指針,因此將其[內容]表示爲const char *並不是真正有意義的。

你可能想要的是將內容加載到內存中,然後將指針(類型爲const char *)存儲到給定塊的開頭。實現這一目標的< /迂腐>方式一:

#include <sstream> 
#include <fstream> 
// ... 
{ 
    std::ostringstream sstream; 
    std::ifstream fs("test.txt"); 
    sstream << fs.rdbuf(); 
    const std::string str(sstream.str()); 
    const char* ptr = str.c_str(); 
    // ptr is the pointer we wanted - do note that it's only valid 
    // while str is valid (i.e. not after str goes out of scope) 
} 
+0

不應該是 iKlsR 2012-07-05 00:10:01

+0

是的。我每次都搞砸了,這很奇怪,因爲我通常從我的錯誤中吸取教訓。 (我很少使用stringstreams,而「每次」都是指錯誤的頭文件。)修正。 – 2012-07-05 23:06:40