ostream :: write实际写入了多少字节?

Avi*_*hek 4 c++ buffer iostream

假设我向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;
}
Run Code Online (Sandbox Code Playgroud)

什么ostream函数可以告诉我实际写了多少字节?

Naw*_*waz 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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,不能保证numberOfBytesWritten真的写入到文件的字节数,但它应该在大多数情况下工作,因为我们没有任何可靠的方法来获得实际写入文件的字节数.

  • 一旦`write`失败,流上的所有进一步操作都是no-ops,直到错误被清除.包括`tellp`,如果以前的操作失败则需要返回-1. (7认同)