将std :: basic_ofstream <unsigned char =“”>连接到FIFO。 bad_cast例外</unsigned>

时间:2010-06-10 16:48:21

标签: c++ iostream fifo unsigned-char

在Linux 2.6.32上使用gcc 4.4.3,将std :: basic_ofstream连接到FIFO时会出现bad_cast异常。

通过调试器,我可以看到错误是在标准库中的各个位置生成的,因为流或filebuf对象的_M_codecvt成员是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 :(得分:0)

我有类似的问题。我发现不能设置skipws - 标志。确保使用std::noskipws(your_stream_obj)。我将它调试到gcc代码中,并找出了为什么会发生这种情况,但已经忘了它。

希望有帮助...