2011-08-22 60 views
2

我有一个函数,它是一个回调从它看起来像一个图书馆如下:如何从字符串流数据写入一个文件(CPP)

void onCallBack(int date, const std::stringstream &data); 

我想写从data变量接收到的数据一个物理文件,所以我这样做:当过存在于数据的更新

void onCallBack(int date, const std::stringstream &data) 
{ 
    ofstream filePtr; 
    filePtr.open("data.file", ios::app); 

    string dataToWrite = data.str(); 
    filePtr << dataToWrite.c_str(); 

    filePtr.close(); 
} 

回调onCallBack函数被调用,我想这个更新的数据写入到文件中。

问题是,数据是std::stringstream类型,它像一个文件/缓冲器和从该缓冲区我只是想读例如更新数据部分:

在第一回调data包含字符串
this is first line

和第二回拨它包含:
this is first line
this is second line

在回调函数我写的第一个电话字符串的文件,并在第二次回电我只是想写this is second line文件不再拳头线。

我该如何提取std::stringstream的更新部分。

const std::stringstream &data变量是不变的,不能修改或我们不能使用tellgsync

更新/编辑:
1.抱歉c标签。
2.对于使用read,我们需要提供块大小来读取,我不知道块的大小。
3.你可以提供一个使用ios_base :: xalloc,ios:base :: iword和ios_base :: pword来做这个的例子。
4.阅读不是一个常量,但tellg是。
5.是的没有人打电话data.str(""),它是从lib的纯虚函数,在我的代码我没有这样做。

+1

删除了“C”的标签,因为这显然不是C. – Flexo

+1

为什么不使用'read',而不是'str',这,大概是从缓存中删除读取字符。 –

+0

修正了标题中的语法错误。 – Rhexis

回答

2

解决方法是记住您以前阅读过多少,然后根据需要仅取出部分字符串。你如何做到这一点取决于你。你可以修改您的通话回传球某种状态中:

void onCallBack(int date, const std::stringstream &data, std::string::size_type& state); 

如果它是一个界面的一部分(不太可能给你贴什么,但那是做一般回调的好方法),您可以存储状态作为私有成员变量。

如果你不关心会发生重入和流永远不会收缩你可以使用本示例中一个static变量,它是最容易在这里展示的工作做一个快速的黑客,而是引狼入室:

// What happens if you change the stringstream? 
// This is why you need to re-think the callback interface 
static std::string::size_type state = 0; 
string dataToWrite = data.str().substr(state); 
state += dataToWrite.size(); 
+0

感谢您的答复,我不能修改回拨原型和你给出的解决方案不工作:(,我已经尝试添加'size_type'和' 。substr'一些,而5〜10次迭代后'dataToWrite'变成空白 – psp1

+1

@ PSP1:这意味着,无论是什么新东西被添加到流或流中尺寸缩水 –

+0

那么,什么是(被清零?)。这个最好的解决办法,我敲我的这一头最后2天。 – psp1

0

如果肯定stringstream对象是每个调用您的回调一样,你可以这样做:

filePtr << data.rdbuf() << std::flush; 
+0

欢迎StackOverflow的。我已经编辑你的答案添加标记你包括代码。 – Flexo

+0

感谢您的答复,但这种方法是行不通的。 – psp1

+0

是它的工作原理请参见:http://coliru.stacked-crooked.com/a/9bf3eb63dda2c8ca – fjardon

0

你可以写该b之前清空文件内容y用ios::trunc代替ios::app

显然,它并不是最优的,每次都要写整个流,但是如果你不能改变原型或刷新流并且你不知道新数据的大小,那么这是我唯一的方法能想到这样做的..

+0

没有这个不能做,因为在最后我们没有得到完整的文件,文件将被provi因为堆栈FILO(管道)将只重复部分数据。 – psp1

相关问题