9

假设我向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 函数可以告诉我实际写入了多少字节?

4

2 回答 2

9

您可以使用.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是写入文件的字节数,但它应该适用于大多数情况,因为我们没有任何可靠的方法来获取写入文件的实际字节数。

于 2013-01-09T15:27:06.833 回答
2

我没有看到任何等同于gcount(). 直接写入streambuf(带sputn())会给你一个指示,但你的请求中有一个基本问题:写入被缓冲并且故障检测可以延迟到有效写入(刷新或关闭)并且没有办法获得访问权限操作系统真正写的内容。

于 2013-01-09T15:34:24.740 回答