2009-10-12 72 views
2

我已经尝试了以下代码与正常的ifstreams和当前的boost:我使用的iostream,都有相同的结果。C++ c_str不返回整个字符串

它旨在从physfs加载文件到内存中,然后将其传递给处理程序来处理(例如图像,音频或数据)。目前,当调用c_str时,它只返回文件的一小部分。

 PhysFS::FileStream file("Resources/test.png" , PhysFS::OM_READ); 

    if(file.is_open()) { 

     String* theFile; 

     theFile = new String((std::istreambuf_iterator<char>(file)), 
     std::istreambuf_iterator<char>()); 

     String::iterator it; 
     for (it=theFile->begin() ; it < theFile->end(); it++) { 
      std::cout << *it; 
     } // Outputs the entire file 

     std::cout << theFile->c_str(); // Outputs only the first few lines 

    } 

该迭代循环输出作为预期整个PNG文件,但c_str调用仅返回前几个字符(\ 211PNG)。

我一直在尝试此代码的变体很长时间没有成功。有任何想法吗?

回答

15

我想象下一个字符是空(ASCII 0)字节。 c_str()只是给你一个* char,因此你写到标准输出被解释为一个以第一个空字节结尾的C类字符串。

如果你确实需要类似C的接口,这个字符串最重要的是,文件 - > c_str()指向你的数据,而文件长度为你提供字符串中的字符数。所以你可能想要做这样的事情:

char *c_value = theFile->c_str() 
for (int i = 0; i < theFile.length; i++) 
{ 
    cout << c_value[i]; 
} 

真正的解决方案取决于你为什么要首先转换为char *。如果您正在调用只接受char *的遗留函数,那么该遗留函数可能还有一个长度参数。

+0

我该如何解决这个问题?我对C风格字符串没有太多经验 – 2009-10-12 16:59:58

+0

不要使用c_str() - 使用std :: string操作 – Mark 2009-10-12 17:07:04

+0

我正在使用需要c字符串输入的库。 – 2009-10-12 17:09:37

2

一个字节的可能是0.这意味着字符串的结尾来清点传递一个char *(这c_str是)

2

我会考虑使用std::vector<unsigned char>代替std::string这个时候。处理矢量中的二进制数据要容易得多。如果您需要访问C型阵列,则可以使用&vec[0]引用基础指针。我也会确保你的文件抽象使用std::ios_base::binary作为引擎盖下的文件模式。

+0

关于在输入上设置二进制模式非常好的一点。 – catfood 2009-10-12 17:40:00

+0

据我所知,在PhysFS中无法以二进制模式打开文件。缺乏关于如何使用PhysFS的适当示例是为什么我认为将文件读入内存而不是显示问题是一个问题。 :-( – 2009-10-12 18:48:25

+0

)是的,我也会这样说:不要把整个文件读入内存,除非我猜你肯定它会很小, – catfood 2009-10-12 19:35:39

相关问题