2011-08-22 46 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

相關問題