我已经尝试了以下代码与正常的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(file)), std::istreambuf_iterator ()); 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).
我一直在尝试使用此代码的变体很长一段时间没有成功.有任何想法吗?
我想下一个字符是一个空(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*的遗留函数,则该遗留函数可能还有一个长度参数.