Невозможно выполнить офстрим с помощью __gnu_cxx::stdio_filebuf

Это создает файл, но ничего не пишет.

std::ofstream outstream;
FILE * outfile;

outfile = fopen("/usr7/cs/test_file.txt", "w");

__gnu_cxx::stdio_filebuf<char> filebuf(outfile, std::ios::out);
outstream.std::ios::rdbuf(&filebuf);

outstream << "some data";
outstream.close();
fclose(outfile);

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


person user3375257    schedule 06.03.2014    source источник
comment
Вы пытались открыть outstream?   -  person 0x499602D2    schedule 06.03.2014
comment
Я думаю, вы должны создать std::ostream и построить его из буфера, как в std::ostream outstream(&filebuf), чтобы вам не пришлось вызывать open()/close() без всякой причины. Если вы сделаете это, вы также захотите сделать outstream.std::ios::rdbuf(&filebuf);.   -  person 0x499602D2    schedule 06.03.2014
comment
Извините, что не описал причину использования этого нестандартного файлового буфера _gnu. Я знаю, что другие простые решения могут производить вывод, но я использую этот подход для блокировки файла во время редактирования; так что другой процесс не может открыть текстовый файл.   -  person user3375257    schedule 06.03.2014
comment
Почему бы вам просто не использовать std::ostream здесь? Если std::ofstream не открыт, то попытка записи ничего не сработает.   -  person 0x499602D2    schedule 08.03.2014


Ответы (1)


std::ostream уже имеет конструктор, делающий правильные вещи:

#include <ext/stdio_filebuf.h>
#include <iostream>
#include <fcntl.h>

int main() {
    auto file = fopen("test.txt", "w");
    __gnu_cxx::stdio_filebuf<char> sourcebuf(file, std::ios::out);
    std::ostream out(&sourcebuf);
    out << "Writing to fd " << sourcebuf.fd() << std::endl;
}

Помните, что stdio_filebuf не закроет FILE* при его уничтожении, поэтому не забудьте сделать это самостоятельно, если вам это нужно.

person Benno    schedule 15.05.2015
comment
› Помните, что stdio_filebuf не закроет ФАЙЛ*, когда он будет уничтожен, поэтому не забудьте сделать это самостоятельно, если вам это нужно. -- Документы gcc говорят, что деструктор stdio_filebuf Закрывает внешний поток данных, если использовался конструктор дескриптора файла. gcc.gnu. org/onlinedocs/libstdc%2B%2B/libstdc%2B%2B-api-4.6/ - person Boris Glick; 26.09.2018