2013-01-09 19 views
2

假設我送一個大的緩衝區的ostream ::寫,但只有它的開始部分實際上是成功寫入,其餘不寫ostream :: write實際寫入多少個字節?

int main() 
{ 
    std::vector<char> buf(64 * 1000 * 1000, 'a'); // 64 mbytes of data 
    std::ofstream file("out.txt"); 
    file.write(&buf[0], buf.size()); // try to write 64 mbytes 
    if(file.bad()) { 
    // but suppose only 10 megabyte were available on disk 
    // how many were actually written to file??? 
    } 
    return 0; 
} 

什麼ostream的功能能告訴我有多少字節實際上書面?

+0

與你的問題無關:你不能使用'void main()',並且你有'vector :: vector()'參數的順序倒退。 –

+0

感謝@Robᵩ固定代碼致力於解決這個問題。 –

回答

6

您可以使用.tellp()知道輸出位置的流計算寫成的字節數:

size_t before = file.tellp(); //current pos 

if(file.write(&buf[0], buf.size())) //enter the if-block if write fails. 
{ 
    //compute the difference 
    size_t numberOfBytesWritten = file.tellp() - before; 
} 

注意,有沒有保證numberOfBytesWritten真的寫入的字節數該文件,但它應該適用於大多數情況,因爲我們沒有任何可靠的方法來獲得寫入文件的實際數量。

+0

這是如何回答關於寫入的問題? – AProgrammer

+0

這會做出很好的評論或編輯,而不是一個答案。 –

+0

@AProgrammer:更新。 – Nawaz

2

我沒有看到gcount()的任何等價物。直接寫入streambuf(與sputn())會給你一個指示,但是你的請求存在一個基本問題:寫入被緩衝,故障檢測可能被延遲到有效寫入(flush或close),並且沒有辦法獲得訪問操作系統真正寫的東西。

+0

實際上,唯一的解決方案是在寫入之前找出文件的大小(從系統,使用系統特定的調用),然後寫入,關閉文件並使用相同系統特定的調用來查找新大小\ –