2011-11-28 33 views
0

在研究强制文件被尽可能快地写_commit问题,我已经看到下面的代码块在几个地方:与FD()

_commit(outputFile.rdbuf()->fd()); 

其中OUTPUTFILE是的std :: ofstream的对象。我基本上是做以下几点:

std::ofstream outputFile; 
outputFile.write((char*)blocks, sizeof(blocks)); 
outputFile.flush(); 
_commit(outputFile.fd()); 
outputFile.close(); 

块是一个简单的char数组数组。我正在做的是写入一个char数组数组来表示一个二进制文件的内容,然后将该数组推送到文件本身。我需要尽可能快地写入文件,因为介质的可靠性不如闪存,而且停电的几率非常高。

当我尝试编译,我收到关于_commit行代码以下错误:

error C2039: 'fd' : is not a member of 'basic_ofstream<char,struct std::char_traits<char> >' 

我应该如何去获得的OUTPUTFILE文件描述符,并把它传递给_commit?

编辑:我改变了上面的代码,以反映使用ofstream.fd(),这应该是ofstream的公众成员。

+4

看一眼'basic_filebuf'类确认它没有'fd()'成员,所以有人使用非=标准扩展。 –

+0

我想我应该修改我的问题,只是要求获取outputFile的文件描述符并将其传递给_commit。 –

+1

标准C++中没有这样的东西,也没有'_commit'函数。非标准扩展根据定义依赖于编译器。 –

回答

3

有人应该写这个答案。他们没有,我会偷走他们的荣耀。 :-)

文件描述符是依赖于实现的。有些系统可能没有。所以C++标准没有定义从fstreamfilebuf得到它的任何方法。

您示例中的_commit函数绝对取决于实现。一个重要的提示是名字以下划线开头。有点谷歌显示_commit只适用于Windows。

为了得到你想要的,你可以写你自己的类从streambuf派生。这个自定义类将以您想要使用的低级术语(Windows,POSIX)实现IO,并且可以提供额外的功能来返回文件描述符或将数据刷新到磁盘。

要使用自定义类作为流,您将创建一个ostream并将它传递给您的streambuf类的指针。

+0

谢谢澄清。我被别的东西搞糊涂了:MSDN显示fd()是ofstream的成员,它在Intellisense中显示出来。但是,_commit行会抛出fd不是basic_ostream成员的错误。在我看来,这是一个VS非标准的扩展,应该服务于这个目的。我很困惑,为什么我显然不能使用fd()。 –