2010-06-10 58 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代码中,发现了为什么会发生,但已经忘记了它。

希望可以帮到...

相关问题