2010-06-10 81 views
0

在Linux 2.6.32上使用gcc 4.4.3時,在將std :: basic_ofstream連接到FIFO時,出現bad_cast異常。將std :: basic_ofstream <unsigned char>連接到FIFO。 bad_cast例外

單步執行調試器,可以看到錯誤是在標準庫中的各個位置生成的,因爲流或filebuf對象的_M_codecvt成員爲NULL。究竟發生在何處取決於操作的順序,但它似乎是每個操作的原因。

那麼我在做一些根本上愚蠢的事嗎? ofstream和ifstream正常工作。有什麼理由不應該將除字符之外的任何東西附加到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

你究竟如何附加流?你有一些示例代碼? – sth 2010-06-10 16:51:10

+0

我已經添加了測試代碼。我只是用basic_(I/O)fstream打開FIFO。 – 2010-06-10 19:02:17

+1

猜測比實際答案更多:流試圖從全局語言環境中獲取std :: codecvt ,但未能獲得一個,因爲唯一的標準codecvt用於char和wchar_t。解決方法:使用char而不是unsigned char,或者使用包含正確類型的codecvt的語言環境來灌注流。 – 2010-06-10 19:22:12

回答

0

我有類似的問題。我發現設置一個skipws -flag一定不能設置。確保使用std::noskipws(your_stream_obj)。我將其調試到gcc代碼中,發現了爲什麼會發生,但已經忘記了它。

希望可以幫到...

相關問題