2011-09-20 27 views
5

我有大量的C++类从文件流中读取数据。这些功能看起来像这样。C++转换文件流功能使用字符串流

bool LoadFromFile(class ifstream &file); 

我创建了一个新的函数来读取内存而不是文件。所以我搜索了一下,一个istringstream似乎没有任何修改代码的伎俩。

bool LoadFromData(class istringstream &file); 

现在我的问题是。我需要构造这个流从char数组读取。该字符串不是空终止的,它是纯二进制数据,我得到了一个大小的整数。我试着将它分配给一个字符串并从一个字符串中创建一个流,但是字符串在空字符后终止..并且数据被复制。

int size; 
char *data; 
string s = *data; 

如何从char数组指针创建字符串而不复制数据+指定指针数据的大小?你知道任何其他的解决方案,而不是一个stringstream吗?

+1

因此,澄清:你的问题是你的'char *'不是空的终止,因此你无法构建一个'std :: string'吗? – quasiverse

+0

是的,这基本上是问题。我也想知道是否有人知道更好的解决方案。 – Tito

+0

这里也许是解决方案:http://stackoverflow.com/questions/2079912/simpler-way-to-create-ac-memorystream-from-char-size-t-without-copying-th(一个版本使用提升,在副本上的数据和一个只适用于gcc) –

回答

4

写一个自己的basic_streambuf类! More details.。 (这样你可以在当前内存上工作。)

从指针和大小创建字符串:string str(data,data+size);(它将复制数据)。

更多的事情:你应该重写你的函数基于istream

bool LoadFromStream(istream &is); 

通过这种方式,你可以做以下,因为这两个istringstreamifstream基于istream(后来这个功能还可以支持TCP流......):

ifstream file; 
istringstream sstream; 

LoadFromStream(file); 
LoadFromStream(sstream); 
+0

非常感谢!这解决了我的问题,根本不改变功能! – Tito

+0

似乎它适用于文件流,但是当我将一个字符串流传递给它时,我得到了这个编译器错误(使用上面的确切代码)。我尽力研究它,但我不明白。它在VS中编译。 无法将参数1从'class std :: basic_istringstream ,class std :: allocator >'转换为'class istream&' – Tito

+0

我在很多地方都使用它。你应该定义为'bool LoadFromStream(istream &is);'''''bool LoadFromStream(class istream &is);'在头文件中我通常不使用'using namespace std;'所以定义是:'bool LoadFromStream(std :: istream &is);'应该包括''。 – Naszta