【问题标题】:how many bytes actually written by ostream::write?ostream::write 实际写入了多少字节?
【发布时间】:2012-12-23 16:45:25
【问题描述】:

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

【问题讨论】:

  • 与你的问题无关:你不能使用void main(),你有vector::vector()的参数顺序倒序。
  • 感谢@Robᵩ 修复代码以集中精力解决问题。

标签: c++ buffer iostream


【解决方案1】:

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

【讨论】:

  • 这如何回答关于写作的问题?
  • @AProgrammer 如果 ostream 写入套接字而不是文件,答案仍然有效?
  • @AviadRozenhek:即使您写入文件也不可靠。但是.tellp() 是我们在 C++ 中得到的全部。
  • @Nawaz 的问题是 [我认为] ostream 的许多实现作为套接字的包装器,tellp() 总是返回 -1 ...
  • 一旦write 失败,对流的所有进一步操作都是无操作的,直到错误被清除。包括tellp,如果之前的任何操作失败,则需要返回-1。
【解决方案2】:

我没有看到任何与gcount() 等效的东西。直接写入streambuf(使用sputn())会给您一个指示,但是您的请求中有一个基本问题:写入被缓冲,并且故障检测可以延迟到有效写入(刷新或关闭)并且没有办法访问操作系统真正编写的内容。

【讨论】:

  • 其实唯一的解决办法就是在写之前先找出文件的大小(从系统中,使用系统特定的调用),然后在写之后,关闭文件,使用同一个系统查找新尺寸的具体调用。\
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 2018-05-28
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多