Соединение std :: basic_ofstreamв ФИФО.исключения bad_cast - PullRequest
0 голосов
/ 10 июня 2010

Используя gcc 4.4.3 в Linux 2.6.32, я получаю исключения bad_cast при подключении std :: basic_ofstream к FIFO.

Заходя через отладчик, я вижу, что ошибка генерируется в разных местах стандартной библиотеки, поскольку член _M_codecvt объекта потока или filebuf имеет значение NULL. Точно, где это происходит, зависит от порядка операций, но, похоже, в каждом из них одна и та же причина.

Так я делаю здесь что-то принципиально глупое? ofstream и ifstream работают нормально. Есть ли какая-то причина, по которой вы не должны прикреплять поток чего-либо кроме char к FIFO?

Заранее спасибо.

РЕДАКТИРОВАТЬ: Добавление исходного кода.

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <sys/stat.h>
#include <pthread.h>
using namespace std;

//#define CHAR char
#define CHAR unsigned char
bool still_writing = true;

void* reader (void*)
{
    basic_ifstream<CHAR> in ("FIFO", fstream::in);
    basic_streambuf<CHAR> *stream_buffer = in.rdbuf();

    bool no_reads = true;
    CHAR buffer[10];

    while (stream_buffer->in_avail() ||
           still_writing || 
           no_reads)
    {
        in.readsome(buffer, 10);
        const int got = (int)in.gcount();
        if (got > 0) {
            std::cerr << "Got something!\n";
            no_reads = false;
        }
    }
}

int main ()
{
    mkfifo ("FIFO", S_IRUSR | S_IWUSR);

    pthread_t reader_thread_id;
    pthread_create (&reader_thread_id, NULL, reader, NULL);

    basic_ofstream<CHAR> out ("FIFO");
    out << (CHAR) 70;
    still_writing = false;
    out.flush();

    pthread_join (reader_thread_id, NULL);

    remove ("FIFO");
}

В этой версии исключение возникает из stream_buffer->in_avail() Если вы поменяете местами операторы #define, все в порядке.

1 Ответ

0 голосов
/ 23 сентября 2011

У меня была похожая проблема.Я обнаружил, что установка флага skipws не должна быть установлена.Для этого используйте std::noskipws(your_stream_obj).Я отладил его в gcc-коде и выяснил, почему это произошло, но уже забыл.

Надеюсь, это поможет ...

...