C ++ c_str不返回整个字符串

时间:2009-10-12 16:57:58

标签: c++ string c-str

我尝试了以下代码,包括正常的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)。

我一直尝试使用此代码的变体很长一段时间没有成功。有什么想法吗?

3 个答案:

答案 0 :(得分:15)

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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