在研究强制文件尽可能快地写入的过程中,我在一些地方看到了以下代码块:
_commit(outputFile.rdbuf()->fd());其中outputFile是std::ofstream对象。我基本上是这样做的:
std::ofstream outputFile;
outputFile.write((char*)blocks, sizeof(blocks));
outputFile.flush();
_commit(outputFile.fd());
outputFile.close();blocks是一个简单的char数组数组。我所做的是写入一个char数组数组来表示二进制文件的内容,然后将该数组推送到文件本身。我需要尽可能快地写入文件,因为介质是不太可靠的闪存,断电的机会非常高。
当我尝试编译时,在_commit代码行上收到以下错误:
error C2039: 'fd' : is not a member of 'basic_ofstream<char,struct std::char_traits<char> >'我应该如何获取outputFile的文件描述符并将其传递给_commit?
编辑:我已经使用ofstream.fd()修改了上面的代码,它应该是ofstream的公共成员。
发布于 2011-11-29 08:47:31
应该有人写下这句话作为答案。他们没有,所以我要偷走他们的荣耀。:-)
文件描述符依赖于实现。有些系统可能没有这样的系统。因此,C++标准没有定义任何从fstream或filebuf获取它的方法。
示例中的_commit函数肯定是依赖于实现的。一个重要的提示是该名称以下划线开头。谷歌的一些信息表明,_commit只能在Windows上运行。
为了得到你想要的东西,你可以编写你自己的从streambuf派生的类。这个定制的类将以您想要使用的低级术语(Windows、POSIX)实现IO,并且可以提供额外的函数来将文件描述符或刷新数据返回到磁盘。
要将自定义类用作流,您需要创建一个ostream,并将指向streambuf类的指针传递给它。
https://stackoverflow.com/questions/8303702
复制相似问题