2

我已经用普通的 ifstreams 和我正在使用的当前 boost:iostream 尝试了以下代码,两者都有相同的结果。

它旨在将文件从 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)。

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

4

3 回答 3

15

我想下一个字符是一个空(ASCII 0)字节。c_str() 只是给您一个 *char,因此您对 stdout 的写入被解释为在第一个空字节处结束的 C 类字符串。

如果你真的需要这个字符串的类 C 接口,主要是 theFile->c_str() 指向你的数据,而 theFile.length 给你字符串中的字符数。所以你可能想做这样的事情:

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

真正的解决方案取决于您首先转换为 char * 的原因。如果您正在调用仅接受 char * 的旧版函数,则该旧版函数可能还有一个长度参数。

于 2009-10-12T16:59:16.147 回答
2

其中一个字节可能是 0。这意味着在传递 char* 时要 cout 结束字符串(c_str 是)

于 2009-10-12T16:59:53.617 回答
2

我会考虑使用std::vector<unsigned char>而不是std::string为此。处理向量中的二进制数据要容易得多。&vec[0]如果您需要访问C 样式数组,则可以使用引用底层指针。我还将确保您的文件抽象也std::ios_base::binary用于引擎盖下的文件模式。

于 2009-10-12T17:28:11.173 回答