_commit проблема с fd () - PullRequest
       22

_commit проблема с fd ()

0 голосов
/ 29 ноября 2011

При исследовании того, как заставить файлы записываться как можно быстрее, я видел следующий фрагмент кода в нескольких местах:

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

где outputFile - это объект std :: ofstream. Я в основном делаю следующее:

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

blocks - это просто массив массивов символов. То, что я делаю, - это запись в массив массивов символов для представления содержимого двоичного файла, а затем отправка этого массива в сам файл. Мне нужно, чтобы файлы записывались как можно быстрее, поскольку носитель является несколько менее надежной флэш-памятью, а вероятность перебоев в электроснабжении необычно высока.

Когда я пытаюсь скомпилировать, я получаю следующую ошибку в строке кода _commit:

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

Как мне получить файловый дескриптор файла outputFile и передать его _commit?

РЕДАКТИРОВАТЬ: я изменил приведенный выше код для отражения использования ofstream.fd (), который должен быть открытым членом ofstream .

1 Ответ

3 голосов
/ 29 ноября 2011

Кто-то должен был написать это как ответ.У них нет, так что я буду красть их славу.: -)

Дескриптор файла зависит от реализации.Некоторые системы могут не иметь такой.Таким образом, Стандарт C ++ не определяет какой-либо метод для его получения из fstream или filebuf.

Функция _commit в вашем примере определенно зависит от реализации.Один большой намек на то, что название начинается с подчеркивания.Немного из Google показывает, что _commit работает только в Windows.

Чтобы получить то, что вы хотите, вы можете написать свой собственный класс, полученный из streambuf.Этот настраиваемый класс будет реализовывать ввод-вывод в низкоуровневых терминах, которые вы хотите использовать (Windows, POSIX), и может предоставлять дополнительные функции для возвращения файловых дескрипторов или сброса данных на диск.Вы могли бы создать поток ostream и передать ему указатель на класс streambuf.

...