2010-10-24 88 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