2013-01-09 17 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

实际上,唯一的解决方案是在写入之前找出文件的大小(从系统,使用系统特定的调用),然后写入,关闭文件并使用相同系统特定的调用来查找新大小\ –