0

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

4

1 に答える 1

0

同様の問題がありました。私が見つけたのは、skipwsフラグを設定してはならないということです。その使用を確実にするためにstd::noskipws(your_stream_obj)。私はそれをgccコードにデバッグし、なぜそれが起こったのかを見つけましたが、すでに忘れていました.

それが役立つことを願っています...

于 2011-09-23T14:54:11.377 に答える